代码评析与重构——求完数问题

求完数问题【题目2-10】

  一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如,6的因子为1、2、3,而6=1+2+3,,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:

  6 Its factors are 1 2 3

                      ——谭浩强 ,《C程序设计(第四版)学习辅导》,清华大学出版社,2010年7月,p43

【评析2-10-1】

  6的因子(divisor)有1、2、3和6共4个,所以所谓的完数(perfect number)显然绝非指那些“一个数如果恰好等于它的因子之和”的数。

  在数论中,完数(perfect number)指的是一个正整数,它等于其正的真因数(proper positive divisors)之和。所谓正的真因数不包括该正整数自身。

【样本2-10】

1.#define M 1000//定义寻找范围 2.#include <stdio.h>3.int main()4.{5.int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;6.int i,a,n,s;7.for(a=2;a<=M;a++)//a是2~1000之间的整数,检查它是否完数 8.{n=0;//n用来累计a的因子的个数9.s=a;//s用来存放尚未求出的因子之和,开始时等于a 10.for(i=1;i<a;i++)//检查i是否a的因子 11.if(a%i==0)//如果i是a的因子 12.{n++;//n加1,表示新找到一个因子 13.s=s-i;//s减去已找到的因子,s的新值是尚未求出的因子之和 14.switch(n)//将找到的因子赋给k1~k9,或k10 15.{case 1:16.k1=i;break;//找到的第1个因子赋给k1 17.case 2:18.k2=i;break;//找到的第2个因子赋给k219.case 3:20.k3=i;break;//找到的第3个因子赋给k321.case 4:22.k4=i;break;//找到的第4个因子赋给k423.case 5:24.k5=i;break;//找到的第5个因子赋给k525.case 6:26.k6=i;break;//找到的第6个因子赋给k627.case 7:28.k7=i;break;//找到的第7个因子赋给k729.case 8:30.k8=i;break;//找到的第8个因子赋给k831.case 9:32.k9=i;break;//找到的第9个因子赋给k933.case 10:34.k10=i;break;//找到的第10个因子赋给k1035.}36.}37.if(s==0)38.{39.printf(“%d,Its factors are “,a);40.if(n>1)printf(“%d,%d”,k1,k2); //n>1表示a至少有2个因子 41.if(n>2)printf(“,%d”,k3);//n>2表示a至少有3个因子42.if(n>3)printf(“,%d”,k4);//n>3表示a至少有4个因子 43.if(n>4)printf(“,%d”,k5);//以下类似44.if(n>5)printf(“,%d”,k6);45.if(n>6)printf(“,%d”,k7);46.if(n>7)printf(“,%d”,k8);47.if(n>8)printf(“,%d”,k9);48.if(n>9)printf(“,%d”,k10);49.printf(“\n”);50.}51.}52.return 0;53.}生气是拿别人做错的事来惩罚自己

代码评析与重构——求完数问题

相关文章:

你感兴趣的文章:

标签云: