繁体   English   中英

C ++中具有大量数字的函数

[英]Functions with very big numbers in C++

我对C ++相当陌生,并且一直在尝试编写一个程序来处理很大的输入数字(7e + 11 ish)。 数量少时效果很好,但数量大时效果不好。 我意识到这是因为很大的数字不适合int,但是当我尝试其他类型(如__int64,long long int,unsigned long long int和uint64_t)时,“ nextsmallestfactor”函数不起作用(通常输出0和因此在除以a(输出)时会触发错误。 那我该怎么用呢? 该代码应取一个大数字,将其重复除以每次均除以最小的数字,最后输出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;

}

非常感谢您的帮助。

问题是,如果给函数一个质数,则代码从不实际返回值,因此会产生未定义的行为。 当我们输入素数时,让我们写出循环的迭代:

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;

如果您想编写一些能够处理巨大数字(包括所有数字)的C ++代码,则需要bignums 然后,我建议您使用一些现有的bignum库,例如GMPLIB 您将能够使用所有数字来计算例如1000的阶乘。

不要尝试重塑自己的bignum库; 因为复杂的基础算法(比朴素的算法更有效)很难理解(和重新发明)。

一些语言和实现(例如Common Lisp的SBCL )具有内置的bignums。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM