项目欧拉#179

时间:2012-09-30 10:30:21

标签: c

问题:找到整数1< n< 10 ^ 7,其中n和n + 1具有相同数量的正除数。例如,14具有正除数1,2,7,14而15具有1,3,5,15。

我无法达到10 ^ 7,因为对于C和我来说这个数字太大了。我怎样才能在C中解决这个问题?

#include<stdio.h>
#include<conio.h>

int divisorcount(int);

int main()
{
    int number,divisornumber1,divisornumber2,j=0;

    for(number=1;number<=100;number++){
        divisornumber1=divisorcount(number);
        divisornumber2=divisorcount(number-1);
        if(divisornumber1==divisornumber2){
            printf("%d and %d\n",number-1,number);
            j++;
        }
    }
    printf("\nThere is %d integers.",j);

    getch();
}

int divisorcount(int num)
{
    int i,divi=0;
    for(i=1;i<=(num)/2;i++)
        if(num%i==0)
            divi++;
    return divi;
}

3 个答案:

答案 0 :(得分:3)

作为如何在一分钟内解决问题的提示,您可以遍历从2到10 ^ 7的每个数字,循环遍历这些数字的所有倍数并递增1(忽略1,因为所有数字都是多个1)。最后,您将获得数组中每个数字的除数数(检查您的编译器是否支持32位索引)。只需使用最终线性扫描即可计算。

答案 1 :(得分:2)

曾经尝试long long num = 100000000LL;? C不够智能,无法在左侧long long右侧输出类型,因此您必须添加LL。使用这种方法,您应该能够处理比正常整数更大的数字,只需以适当的方式更改函数和变量。

long long的大小始终至少2^64位,您可以在Wikipedia上查看。

提示:正如评论中提到的那样,Project Euler不是关于强制执行的。这是一种蹩脚的方法。想想一些更好的策略。您可能希望在math.stackexchange获得帮助?

编辑:我不知道为什么我认为uint32_t10^7来说还不够 - 抱歉这个错误。

答案 2 :(得分:1)

为了扩展nhahtdh的想法,为了使它更快(以使其更复杂为代价),制作一个素数筛,计算素数高达sqrt(10 ^ 7)=约3170.然后指数素数因子确定倍数,使得(exp + 1)的乘积是除数的整数。因此,您可以将数组设置为1,然后循环遍历每个素数,乘以该倍数的每个位置的素数指数贡献(加1)。