2014-08-29 46 views
-1

我对C++相当陌生,并且一直在试图编写一个程序来处理非常大的输入数字(7e + 11 ish)。它可以在很少的数字下正常工作,但不适用于这些大数字。我意识到这是因为非常大的数字不适合int,但是当我尝试像__int64,long long int,unsigned long long int和uint64_t这样的其他类型时,函数“nextsmallestfactor”不起作用(它通常输出0和因此在除以a,输出时触发错误)。我应该使用什么?这段代码应该占用很大的数字,每次重复将其分为最小的数字,并在最后输出一个最高的素数因子。在C++中使用非常大的数字的函数

#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; 

}

非常感谢您的帮助。

+1

int的最大尺寸是2,147,483,647 – andre 2014-08-29 19:44:44

+0

nextsmallestfactor()中的所有代码路径都不会返回一个值...但是如果将条件更改为factor <= numbertofactorise,那么您应该很好,因为x%x == 0 for所有值,if语句在一次迭代中必须为真 – clcto 2014-08-29 19:44:51

+1

You h要使用更大的'int'类型,比如'int64_t'。至于“我的功能不起作用”......呃,你必须弄清楚什么不起作用。无论你的函数有什么问题,它们都与你使用'int64_t'的事实无关。 – AnT 2014-08-29 19:45:29

回答

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; 
+0

我在这里创建了一个工作示例:http://ideone.com/WivvOP – clcto 2014-08-29 19:55:49

+0

非常感谢。你可爱的ASCII艺术帮助我理解和解决问题 - 我只需要将int更改为int64_t,并将因子 2014-08-30 09:56:48

1

如果你想写一些C++代码能够处理巨大的数字(所有数字),你需要bignums。那么我建议你使用一些现有的bignum库,如GMPLIB;你将能够计算例如具有所有数字的1000的阶乘。

不要试图重塑自己的bignum库;因为复杂的底层算法(比天真的算法更有效)很难理解(和重新发明)。

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