C语言——求水仙花数

昨日,雷先生偶有闲致,评讲了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);
        }
    }
}