问题描述
- c语言整数超出unsigned long long的表示范围该怎么办
-
#define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<limits.h> unsigned long long number(int n); int main(void) { int num; printf("你要计算第几个数? (q to quit):n"); while (scanf("%d", &num) == 1) { if (num < 0) printf("无效的数字n"); else { printf("第%d 个数是%llun", num, number(num)); } printf(" 输入一个0-100的整数 (q to quit):n "); printf("可以表示的最大的数为%llun", ULLONG_MAX); } return 0; } unsigned long long number(int n) { unsigned long long x1 = 0, x2 = 1, xn = 0; if (n < 3) xn = 1; else for (int i = 2; i <= n; ++i) { xn = x1 + x2; x1 = x2; x2 = xn; } return xn; }
上面的程序计算斐波那契数列的第97项时就已经溢出了,如果要求第100项、第10000项。。。。。该怎么办?
解决方案
用字符串模拟四则运算实现大数计算。或者用double求约略数。
解决方案二:
1.在64位系统上,unsigned long long是8个字节,和unsigned long 一样;
2.如果unsigned long long溢出了,可以这么处理,起始就是自己实现16字节的整数,如果还不够,类似方法实现24,32字节整数:
unsigned long long high;
unsigned long long low;
low表示底8字节,high表示高8字节,如果low溢出了,就high ++
解决方案三:
用高精度来处理大数,矩阵乘法和快速幂解决n较大的情况
时间: 2024-09-30 19:32:38