求水仙花数(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 ", 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 ", i);
    }
    }
    }
  • 相关内容推荐