数据溢出(最后两个数和sum),float,long long和-int64都试过了,还是不行,求解决办法
用 unsigned long long
printf 用 %llu
对于数据溢出问题,可以尝试以下解决方案:
使用更大的数据类型,如unsigned long long或者大数库。这样可以扩大数据范围,但是也会增加空间使用和计算复杂度。对于大数库的使用,可以参考各种语言的bignum类库,例如Python中的decimal库、Java中的BigInteger类,C++中的GMP库等。
使用模运算,将数据结果限定在一个范围内。例如对于一个不大于n的数x取模,得到的结果一定不会溢出。但是在使用模运算时要注意,可能会出现误差或者需要在取模前做一些数值调整操作。
对于计算精度要求不高的场景可以使用浮点数或者定点数。浮点数在存储时存在一定的精度损失,但是可以通过设置精度和舍入策略来控制误差。定点数可以将小数转化为整数进行运算,避免了精度的问题,但是需要进行一些数据类型转化操作。
以下是使用C++实现的代码示例:
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp> //引入boost库
using namespace std;
using namespace boost::multiprecision;
int main() {
cpp_int a = 1000000000000000000;
cpp_int b = 1000000000000000000;
cpp_int c = a * b;
cout << c << endl;
}
#include <iostream>
using namespace std;
const int mod = 1000000007; //定义取模数
int main() {
long long a = 1000000000;
long long b = 1000000000;
long long c = (a % mod) * (b % mod) % mod; //将计算结果限制在mod内
cout << c << endl;
}
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a = 1000000000000000000.0;
double b = 1000000000000000000.0;
double c = a * b;
cout << ceil(c) << endl; //通过向上取整来控制精度
}