在C ++中处理大量数字?
时间:2020-03-06 14:33:50 来源:igfitidea点击:
在C ++中处理大型数字输入的最佳方法是什么(例如" 10 ^ 100")?
对于算法,我通常切换到ruby,有时使用字符串。
还有其他好的方法吗?
解决方案
假设我们正在谈论输入数字,则双精度将使我们达到1.7976931348623157 x 10 ^ 308
我们是否正在寻找如何对收到的大量输入执行操作?有一个很大的整数C ++库(类似于Java),可以让我们执行算术运算...
我们可能想看看gmplib,它是C和C ++的任意精度数字处理库
听起来我们正在寻找一种输入任意精度数字的方法。
这是我们可以使用的两个库:GMP和MAPM
如果我们希望它是准确的,则需要一个用于处理大数的库。 Java具有BigInt,无论我们要带多少位数,BigInt都将始终是准确的,并且可以对它们进行数学运算。包括所有源代码,我们可以传输它,但这实际上不是C ++最擅长的事情-我将使用基于JVM的语言并使用Big库之一。
除非我们希望它变慢,否则我不认为我会使用ruby,并且我假设既然我们在谈论C ++,那么速度在某种程度上是设计考虑因素。
正如其他人已经指出的那样,我们可能会发现C ++中有各种bignum /任意精度库。如果不需要速度,那么我的印象是Python和Lisp默认都使用bignums。
如果我们希望为此编写自己的代码,请尝试使用字符串存储大数字...然后,我们可以在其上创建+ / *之类的基本操作,例如-
#include <iostream>
using namespace std;
string add (string &s1, string &s2){
int carry=0,sum,i;
string min=s1,
max=s2,
result = "";
if (s1.length()>s2.length()){
max = s1;
min = s2;
} else {
max = s2;
min = s1;
}
for (i = min.length()-1; i>=0; i--){
sum = min[i] + max[i + max.length() - min.length()] + carry - 2*'0';
carry = sum/10;
sum %=10;
result = (char)(sum + '0') + result;
}
i = max.length() - min.length()-1;
while (i>=0){
sum = max[i] + carry - '0';
carry = sum/10;
sum%=10;
result = (char)(sum + '0') + result;
i--;
}
if (carry!=0){
result = (char)(carry + '0') + result;
}
return result;
}
int main (){
string a,b;
cin >> a >> b;
cout << add (a,b)<<endl;
return 0;
}
好吧,我认为进行这种算术运算的最佳方法是使用字符串。将输入作为命令行参数,然后使用诸如atoi()和itoa()之类的字符串函数来操纵整个逻辑!但是,嘿,可以做乘法和除法吗?我认为以这种方式输入的字符串" strlen"对于编译器的编程并不重要,除非逻辑合理。

