当前位置:   article > 正文

史上最笨拙最丑陋结果又最滑稽的C代码

史上风格最差c程序是什么
9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内所有完数,并按下面格式输出其因子:
    6 ,Its factors are 1 2 3
解:方法一。
程序如下:
  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个因子赋给k2
  19. case 3:
  20. k3=i;break; //找到的第3个因子赋给k3
  21. case 4:
  22. k4=i;break; //找到的第4个因子赋给k4
  23. case 5:
  24. k5=i;break; //找到的第5个因子赋给k5
  25. case 6:
  26. k6=i;break; //找到的第6个因子赋给k6
  27. case 7:
  28. k7=i;break; //找到的第7个因子赋给k7
  29. case 8:
  30. k8=i;break; //找到的第8个因子赋给k8
  31. case 9:
  32. k9=i;break; //找到的第9个因子赋给k9
  33. case 10:
  34. k10=i;break; //找到的第10个因子赋给k10
  35. }
  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. }
——谭浩强 ,《C程序设计(第四版)学习辅导》,清华大学出版社,2010年7月,p43~44

1.

题目本身是错的:

一个数如果恰好等于它的因子之和”,完数不是这样定义的

“6的因子为1,2,3” ,6的因子还有6

2.

int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;

这个巨生猛,一口气定义了10个变量,名字也很趣。颇有愚公移山的气概,吃奶的力气都使出来了
为什么偏偏定义10个而不是9个或11个呢?莫名其妙

3.

s=a;                            //s用来存放尚未求出的因子之和,开始时等于a
实际上s不是注释中所说的含义
赋值为a的做法也非常笨拙

4.
         if(a%i==0)                   //如果i是a的因子
    {n++;        

雷人缩进的风格

5.   6.
     switch(n)                      //将找到的因子赋给k1~k9,或k10      
       {case 1:

“将找到的因子赋给k1~k9,或k10 ”,看起来不像中国话
case 1:的位置也很扎眼

7.
if(n>1)printf("%d,%d",k1,k2);  //n>1表示a至少有2个因子
居然能一口气连写9句if,而且节约,每句只占一行,排列整齐(除了第一句)
看得出作者耐力很好

8.
if(n>3)printf(",%d",k4);       //n>3表示a至少有4个因子
if(n>4)printf(",%d",k5);       //以下类似
原来注释还能这么写,大开眼界

9.
更滑稽的是运行结果
6,Its factors are 1,2,3

28,Its factors are 1,2,4,7,14
496,Its factors are 1,2,4,8,16,31,62,124,248
根本不符合题目的要求
按下面格式输出其因子:
    6 ,Its factors are 1 2 3

附:因子的定义

假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。 需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。

http://zh.wikipedia.org/wiki/%E5%9B%A0%E6%95%B8

转载于:https://www.cnblogs.com/pmer/archive/2011/06/20/2085504.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/604443
推荐阅读
相关标签
  

闽ICP备14008679号