C语言完数练习题
找出10000以內(nèi)的自然數(shù)中的所有完數(shù),并統(tǒng)計(jì)找到的完數(shù)個(gè)數(shù)。完數(shù)即它恰好等于除它本身之外的因子之和。例:6=1+2+3
第一種方法:本題的關(guān)鍵是如何產(chǎn)生自然數(shù)n的所有因子。可以采用試探法,判斷每一個(gè)比n小的自然數(shù)是否是n的一個(gè)因子(n%i==0),并計(jì)算自然數(shù)n的所有因子之和,完整程序如下
#include<stdio.h> int main() {int i,n,s,count=0;for (n=1;n<10000;n++){s=0;for (i=1;i<n;i++)if (n%i==0)s+=i;if (s==n){printf("%d ",n);count++;}}printf("完數(shù)有%d個(gè)",count);return 0; }第二種方法:對于一個(gè)自然數(shù)n,它的因子是成對出現(xiàn)的,在小于或等于根號n出現(xiàn)一個(gè)因子,則在大于根號n必然也有一個(gè)對應(yīng)的因子。注意,如果n=m2,則因子m不會成對出現(xiàn)。例如,n=36,因子有1,2,3,4,6,9,12,18,36,則因子6不會成對出現(xiàn),因此為了提高算法的性能,程序可以改寫為如下
#include<stdio.h> #include<math.h> int main() {int i,n,s,m,count=0;for (n=2;n<10000;n++){ //1不是完數(shù),直接排除s=1; //由于1是任意一個(gè)自然數(shù)的因子,直接加進(jìn)去m=sqrt(n);for (i=2;i<=m;i++)if (n%i==0)s+=i+n/i;if (n==m*m)s-=m;if (s==n){printf("%d, ",n);count++;}}printf("完數(shù)有%d個(gè)",count);return 0; }總結(jié)
- 上一篇: 计算机应用教研室工作计划,高校教研室工作
- 下一篇: [react] 使用高阶组件(HOC)实