#ex9 C语言标准实验报告
实验内容:
上机完成以下编程实验,调试运行程序并完成报告。
- 1.输入一个数,使用质数表对其进行因式分解。
注:因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法使用质数表的方法,该方法就是求出小于该数的所有质数,并试试看是不是可以整除,从而完成因式分解。
- 2.求10000以内的所有完美数,要求程序要有较高的运算效率。
说明:如果有一数n,其真因数(Proper factor)的总和等于n,则称之为完美数(Perfect Number),例如以下几个数都是完美数:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
程序基本上不难,第一眼看到时会想到使用循环求出所有真因数,再进一步求因数和,不过若n值很大,则此法会花费许多时间在循环测试上,十分没有效率,比如这个问题中,学生可编简单程序试试循环的运行效率。
提示:这个问题可利用前一个问题中的质数表来提高效率。
参考代码:
#include
#include
int prime(int a);
int Prime[150000];
int num=2;
void FindPrime(int n);
void Perfect(int n);
int main()
{int n,mode,i;Prime[1]=2;Prime[2]=3;while(1){printf("\n请输入数字选择功能:\n");printf("1:输入一个数,对其进行因式分解;\n");printf("2:求10000以内的所有完美数;\n");printf("0:退出.\n");printf("-------------------------------\n");scanf("%d",&mode);if(mode==1){printf("请输入要因式分解的数:"); scanf("%d",&n);printf("%d=",n);FindPrime(n);for(i=1;Prime[i]*Prime[i]<=n;){if(n%Prime[i]==0){printf("%d*",Prime[i]);n/=Prime[i];}else i++;}printf("%d\n",n);}else if(mode==2){printf("10000以内的完美数有:\n");Perfect(10000);}else if(mode==0) break;else printf("选择功能错误!\n");}return 0;
}
int prime(int a)
{int i;for(i=2;i*i<=a;i++)if(a%i==0) return 0;return 1;
}
void FindPrime(int n)
{int i;for(i=6;i<=n;i+=6){if(prime(i-1)){num++;Prime[num]=i-1;}if(prime(i+1)){num++;Prime[num]=i+1;}}if(i-6==n-1&&prime(n)) num--;if(i-6==n&&prime(n+1)) num--;return ;
}
void Perfect(int n)
{int i,j;for(i=2;i
讲解:
这个报告……完美数那一部分直接循环效率也不低啊。
要真想追求高效率打表不香吗?
更新:上文代码中没有使用质数筛(其实是我这蒟蒻不会),导致在对较大的数进行因式分解时程序直接死掉x_x,如果有更高要求的小伙伴可以自己学下质数筛法优化一下本程序。
求实求真,大气大为。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
