zoukankan      html  css  js  c++  java
  • 史上最笨拙最丑陋结果又最滑稽的C代码

    9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内所有完数,并按下面格式输出其因子:
        6 ,Its factors are 1 2 3
    解:方法一。
    程序如下:
    #define M 1000                       //定义寻找范围 
    #include <stdio.h>
    int main()
    {
      int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;
      int i,a,n,s;
      for(a=2;a<=M;a++)                 //a是2~1000之间的整数,检查它是否完数 
       {n=0;                            //n用来累计a的因子的个数
        s=a;                            //s用来存放尚未求出的因子之和,开始时等于a 
         for(i=1;i<a;i++)               //检查i是否a的因子 
           if(a%i==0)                   //如果i是a的因子 
        {n++;                           //n加1,表示新找到一个因子 
         s=s-i;                         //s减去已找到的因子,s的新值是尚未求出的因子之和 
         switch(n)                      //将找到的因子赋给k1~k9,或k10 
          {case 1:
              k1=i;break;               //找到的第1个因子赋给k1 
           case 2:
              k2=i;break;               //找到的第2个因子赋给k2
           case 3:
              k3=i;break;               //找到的第3个因子赋给k3
           case 4:
              k4=i;break;               //找到的第4个因子赋给k4
           case 5:
              k5=i;break;               //找到的第5个因子赋给k5
           case 6:
              k6=i;break;               //找到的第6个因子赋给k6
           case 7:
              k7=i;break;               //找到的第7个因子赋给k7
           case 8:
              k8=i;break;               //找到的第8个因子赋给k8
           case 9:
              k9=i;break;               //找到的第9个因子赋给k9
           case 10:
              k10=i;break;              //找到的第10个因子赋给k10
          }
        }
        if(s==0)
        {
         printf("%d,Its factors are ",a);
         if(n>1)printf("%d,%d",k1,k2);  //n>1表示a至少有2个因子 
         if(n>2)printf(",%d",k3);       //n>2表示a至少有3个因子
         if(n>3)printf(",%d",k4);       //n>3表示a至少有4个因子 
         if(n>4)printf(",%d",k5);       //以下类似
         if(n>5)printf(",%d",k6);
         if(n>6)printf(",%d",k7);
         if(n>7)printf(",%d",k8);
         if(n>8)printf(",%d",k9);
         if(n>9)printf(",%d",k10);
         printf("\n");
        }         
       }
       return 0;
    }
    
    ——谭浩强 ,《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

  • 相关阅读:
    eclipse+maven springMVC搭建
    mac下搭建eclipse+git环境并导入项目
    mvn deploy返回400错误的几种可能
    vector的坑——C++primer练习6.33总结
    2015/4/8腾讯笔试
    ColKang v1.0
    C++学习——C++复合类型
    朴素贝叶斯文本分类-在《红楼梦》作者鉴别的应用上(python实现)
    python:BeautifulSoup学习
    python:网络爬虫的学习笔记
  • 原文地址:https://www.cnblogs.com/pmer/p/2085504.html
Copyright © 2011-2022 走看看