查找最大素数时,“整数常数对于‘长’类型来说太大了”

Posted

技术标签:

【中文标题】查找最大素数时,“整数常数对于‘长’类型来说太大了”【英文标题】:"integer constant is too large for ‘long’ type" when finding largest prime factor 【发布时间】:2011-01-25 11:31:26 【问题描述】:

我正在解决欧拉项目 3:

Description: The prime factors of 13195 are 5, 7, 13 and 29.
             What is the largest prime factor of the number 600851475143 ?

这是我生成答案的代码。但是我需要一个整数类型来保存600851475143。当我在 Mac 上的 GCC 上编译它时,我得到:

integer constant is too large for ‘long’ type". 

我预计 long long 可以轻松持有这个数字。我也试过让它不签名。为什么我的代码不能保存这么小的数字,我该怎么做才能让它工作?

#include <iostream>
#include <vector>

using namespace std;

static bool IsPrimeFactor(int numToTest,int testNum,vector<int> factors)

    if(numToTest%testNum==0) // is it a factor?
    
        // see if it is a prime factor
        for(unsigned int i=0; i < factors.size(); i++)
        
            if(testNum%factors[i]==0)  // see if this factor
                                      //is divisble by one we have already

                return false;
            
        

        return true;
    
    return false;


int main() 
    unsigned long long numToTest=600851475143;
    unsigned int testNum=2;  // 0 and 1 are assumed
    vector<int> factors;   

    while(testNum<numToTest)   // don't go higher than the max num
    
        if(IsPrimeFactor(numToTest,testNum,factors)) // is it a factor?
        
            factors.push_back(testNum); // got through prime factors 
                                           // and none divided it

        testNum++;
    

    for(unsigned int i=0; i < factors.size(); i++)
    
        cout << "factor " <<factors[i] << endl;
    

    cout<<"Highest factor: " << factors[factors.size()-1]<<endl;

    return 0;

【问题讨论】:

你的代码中有一些严重的概念问题——我不想破坏你做欧拉项目的乐趣,但你可能想了解一下如何进行素数分解;) 【参考方案1】:

检查this 问题。你必须像这样指定你的文字:

600851475143LL

【讨论】:

从 C++11 开始,无后缀十进制整数常量的类型为 intlong intlong long int,具体取决于其类型。在 C++03 中,它是 intlong int——因为 long long int 类型还不存在。支持 long long int 的符合标准的编译器 应该 接受这样的无后缀文字,但支持 long long int 作为扩展的旧编译器可能不会。使用 -std=c++11 或等效项(如果您的编译器支持)调用编译器应该可以工作。另一方面,添加LL 后缀是无害的,并且可以说更清晰。【参考方案2】:

正如@Space_C0wb0y 所说,您需要为文字指定一个后缀。

另外,您的IsPrimeFactor 函数会出现问题 - 参数是整数,但正如您已经发现的那样,整数甚至长整数都不足以存储您将要存储的数字反复传入...

【讨论】:

谢谢。我知道该函数需要一些重构。

以上是关于查找最大素数时,“整数常数对于‘长’类型来说太大了”的主要内容,如果未能解决你的问题,请参考以下文章

高速查找素数

NYOJ--187--快速查找素数(筛选法,素数打表)

使用列表理解查找素数

1405 两素数的和与最大积

素数筛选 - bailian 4138:质数的和与积

关于素数的快速查找——素数筛选法