Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 欧拉计划#179_C - Fatal编程技术网

C 欧拉计划#179

C 欧拉计划#179,c,C,问题:求整数1

问题:求整数1 我不能达到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;
}
#包括
#包括
整数除数计数(整数);
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。