C语言——求水仙花数

2017-12-26 19:10:08来源:cnblogs.com作者:子非寒人点击

分享

昨天,雷老师偶有闲致,评讲了n周前的C程序设计作业。其中讲到了一到求水仙花数的题,给出了一种漂亮的算法,在此记录下来。

原题

输出所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字立方和等于该数本身。

解题

思路

  • 初始化i=100。
    ①取i的各位数,百位a,十位b,个位c。
    ②判断i==a∧3+b∧3+c∧3 是否成立
    ③如果成立则输出,否则不输出。
    ④i=i+1,当i小于1000重复①,否则结束。

关键算法:取任意三位数的各位数

算法一:除减法

①将数除以100,由整型数据特点,小数点后被忽略,取得百位a。
②该数减去a * 100,除以10,得到十位b。
③该数减去a * 100和b * 10即得个位c。

代码实现
a = i / 100;b = (i - 100 * a) / 10;c = i - 100 * a - 10 * b;   

完整代码:

void NarcissusNumber(int m) {    int a;                                        //三位数的百位    int b;                                        //三位数的十位    int c;                                        //三位数的个位    int d;                                        //各位数字立方和与数的差值    a = m / 100;    b = (m - 100 * a) / 10;    c = m - 100 * a - 10 * b;                           d = a*a*a + b*b*b + c*c*c - m;    if (d==0)                                 //各位数字立方和与数相等,输出    {        printf("%d/n", m);    }}
  • 好处:易理解,菜鸟基本都会这算法。
  • 不足:当数字位数较大时,减法操作需要进行多次,比较代码比较冗长。

算法二:除余法

①将数除以10取余数得个位c
②将数除以10后再与10取余得到十位b
③将该数除以100再与10取余得到百位a

代码实现
int c = n % 10;           //个位int b = n / 10 % 10;      //十位int a = n / 100 % 10;     //百位,或者写int c = n / 100;
  • 这种算法对我们菜鸟来说很新奇,难以想到。
  • 即使这样,该算法也不比算法一简洁,所以需要改进。

算法二改进

①将数除以10取余数得个位c,将该数除以10
②重复①得到十位b
③继续重复①得到百位a

代码实现
int sum = 0; //求和变量int temp=i;  //存放数值i,防被覆盖而丢失int rem;   //余数for (int j = 0; j < 3; j++)//第一次循环得到个位立方和,第二次循环得到个位与十位立方和...{        rem = temp % 10;        temp /= 10;        sum += rem * rem*rem;}
  • 这算法简便,效率较高
  • 有点难懂

完整代码

//输出水仙花void NarcissusNumber(){    for (int i = 100; i < 1000; i++)    {        int sum = 0;        int temp=i;        int rem;        for (int j = 0; j < 3; j++)        {            rem = temp % 10;            temp /= 10;            sum += rem * rem*rem;        }        if (sum == i)        {            printf("%d/n", i);        }    }}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台