C 欧拉计划#179
问题:求整数1C 欧拉计划#179,c,C,问题:求整数1
#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;
}
#包括
#包括
整数除数计数(整数);
int main()
{
整数,除数为1,除数为2,j=0;
对于(number=1;number是否尝试过long-long-num=10000000ll;
?C不够聪明,无法从左侧得出右侧的类型long-long
,因此您必须添加LL
。使用这种方法,您应该能够处理比正常整数更大的数字,只需在适当的时间内更改函数和变量即可对
long-long
的大小始终至少为2^64
位,您可以查看它
提示:正如有人在评论中提到的,Euler项目不是关于暴力的。这是一个蹩脚的方法。考虑一些更好的策略。你可能想在
编辑:我不知道为什么我会想,uint32\u t
对于10^7
-很抱歉犯了这个错误。有没有试过long-long-num=1000000000ll;
?C不够聪明,不能从左到右推断long-long
类型,所以你必须添加LL
若采用这种方法,您应该能够处理比普通整数更大的数字,只需以适当的方式更改函数和变量即可
long-long
的大小始终至少为2^64
位,您可以查看它
提示:正如有人在评论中提到的,Euler项目不是关于暴力的。这是一个蹩脚的方法。考虑一些更好的策略。你可能想在
编辑:我不知道为什么我会想,uint32\u t
对于10^7
是不够的-很抱歉这个错误。作为一个如何在一分钟内解决问题的提示,您可以遍历从2到10^7的每个数字,循环遍历这些数字的所有倍数,然后递增1(1被忽略,因为所有数字都是1的倍数)。最后,您将获得数组中每个数字的除数(检查编译器是否支持32位索引)。只需使用最后一次线性扫描进行计数。作为如何在一分钟内解决问题的提示,您可以遍历从2到10^7的每个数字,循环遍历这些数字的所有倍数,并递增1(1被忽略,因为所有数字都是1的倍数)。最后,您将获得数组中每个数字的除数数(检查编译器是否支持32位索引)。只需使用最后一次线性扫描进行计数。要扩展NHAHDH的想法,使其更快(以使其更复杂为代价),请制作一个质数筛,将质数计算到sqrt(10^7)=大约3170。然后素数因子的指数决定倍数的数量,因此(exp+1)的乘积是整数除以该数字的数量。因此,您可以将数组设置为1,然后在每个素数上循环,乘以素数的指数贡献(加1)对于每个位置,它都会相乘。为了扩展NHAHDH的想法,使其更快(以使其更复杂为代价),制作一个质数筛,计算质数,直到sqrt(10^7)=约3170。然后质数因子的指数确定相乘的数量,以便(exp+1)的乘积整数的个数除以这个数。所以你可以把数组设为1,然后循环每个素数,乘以素数的指数贡献(加1)对于每个位置,它都会相乘。对于int
来说太大,而不是C。请使用long
代替。您可以反向工作,并标记一个数字的所有倍数。对于int
来说太大,而不是C。使用long
代替。您可以使用b代替查找可以分割的数字确认并标记数字的所有倍数。对于32位计算机,10^7应该适合int
,除非OP使用的是16位编译器…你是对的…为什么我认为这是问题的原因?!o.o由于其关于数据类型的一般内容,我将留下这个答案。long
是由C89定义的吗?@pmg:long
是由C99而不是C89。@doruk:正如我在回答中提到的,你需要一个好的策略,通常如何以智能的方式进行暴力(例如,可能忽略素数?)或者如何使用不同于数论的属性。这将适用于数学。stackexchange。10^7应该适合32位计算机的int
,除非OP使用16位编译器…你是对的…为什么我认为这是问题的原因?!o.o我将留下这个答案,因为它包含关于数据类型的一般内容。长吗e> 由C89定义?@pmg:long
由C99定义,但不是由C89定义。@doruk:正如我在回答中提到的,您需要一个好的策略,通常如何以智能方式进行暴力(例如,可能忽略素数?)或如何使用与数论不同的属性。这将适用于math.stackexchange。