C ++中具有非常大数字的函数

时间:2014-08-29 19:42:13

标签: c++ function long-integer

我是C ++的新手,并且一直在尝试编写一个程序来处理非常大的输入数字(7e + 11 ish)。它适用于少量数字,但不适用于这些大数字。我意识到这是因为非常大的数字不适合int,但是当我尝试其他类型如__int64,long long int,unsigned long long int和uint64_t时,函数“nextsmallestfactor”不起作用(它通常输出0和所以当用a,输出除以时会触发错误。那我应该怎么用?这段代码应该取一个大数字,重复除以每次除以它的最小数字,最后输出一个最高的素数因子。

#include <iostream>
using namespace std;

int numberToFactorise = 700000000000;
int nextsmallestfactor(int numbertofactorise){
    for (int factor = 2; factor < numbertofactorise; factor++){
    if (numbertofactorise%factor == 0){
        return factor;
    }
}
}
int main(){
    int quotient = numberToFactorise;
    int a=1;
    while (quotient > 1){
        a = nextsmallestfactor(quotient);
        quotient = quotient / a;
    };
    cout << a;
cout << endl;
system("PAUSE");
return 0;

}

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

问题在于,如果为函数提供素数,则代码实际上不会返回值,因此会产生未定义的行为。让我们在输入素数时写出循环的迭代:

nextsmallestfactor( 5 ):

      factor  |  numbertofactorise % factor
       ----------------------------
        2     |   5%2 = 1
        3     |   5%3 = 2
        4     |   5%4 = 1 

 END (no return)

如果您更改条件以检查因子直到并包括 numbertofactorize,那么它将执行:

nextsmallestfactor( 5 ):

      factor  |  numbertofactorise % factor
       ----------------------------
        2     |   5%2 = 1
        3     |   5%3 = 2
        4     |   5%4 = 1 
        5     |   5%5 = 0  ---> return 5;

答案 1 :(得分:1)

如果你想编写一些能够处理大量数字(包含所有数字)的C ++代码,你需要bignums。然后我建议您使用一些现有的bignum库,如GMPLIB;你将能够计算,例如因子为1000及其所有数字。

不要试图重塑自己的bignum图书馆;因为复杂的基础算法(比天真的算法更有效)很难理解(并且重新发明)。

某些语言和实现(例如Common Lisp的SBCL)内置了bignums。