在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"对于编译器的编程并不重要,除非逻辑合理。