问题:找到整数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;
}
答案 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_t
对10^7
来说还不够 - 抱歉这个错误。
答案 2 :(得分:1)
为了扩展nhahtdh的想法,为了使它更快(以使其更复杂为代价),制作一个素数筛,计算素数高达sqrt(10 ^ 7)=约3170.然后指数素数因子确定倍数,使得(exp + 1)的乘积是除数的整数。因此,您可以将数组设置为1,然后循环遍历每个素数,乘以该倍数的每个位置的素数指数贡献(加1)。