1. 程式人生 > >C語言求水仙花數程式碼解析

C語言求水仙花數程式碼解析

水仙花數

“水仙花數”又稱為“阿姆斯特朗數”。如果一個n(n≥3)位數的各位數字的n次冪之和等於該數本身,則該數稱為“水仙花數”。

問題描述

輸出所有的“水仙花數”,所謂的“水仙花數”是指一個三位數其各位數字的立方和等於該數本身,例如153是“水仙花數”,因為:153 = 13 + 53 + 33

問題分析

根據“水仙花數”的定義,判斷一個數是否為“水仙花數”,最重要的是要把給出的三位數的個位、十位、百位分別拆分,並求其立方和(設為s),若s與給出的三位數相等, 三位數為“水仙花數”,反之,則不是。

演算法設計

“水仙花數”是指滿足某一條件的三位數,根據這一資訊可以確定整數的取值範圍是 100〜999。對應的迴圈條件如下:

for(n=10; n<1000; n++)
{
    //......
}

對程式碼的說明:

  •  將n整除以100,得出n在百位上的數字hun。
  • 將(n-i*100)整除以10(或將n先整除以10再對10求模n/10%10),得出n在十位上的數字ten。
  • 將n對10取餘,得出n在個位上的數字ind。
  • 求得這三個數字的立方和是否與其本身相等,若相等,則該數為水仙花數。

對於每個位置上的數值將其拆分的演算法有很多種,根據不同情況選擇不同演算法(對於同一問題不同演算法的效率有時會相差很多)。

下面是完整的程式碼:

#include <stdio.h>
int main()
{
    int hun, ten, ind, n;
    printf("結果是:");
    for( n=100; n<1000; n++ )  /*整數的取值範圍*/
    {
        hun = n / 100;
        ten = (n-hun*100) / 10;
        ind = n % 10;
        if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind)  /*各位上的立方和是否與原數n相等*/
            printf("%d  ", n);
    }
    printf("\n");
 
    return 0;
}

執行結果

C語言求水仙花數程式碼解析

於是,100~999範圍內(三位數中)的“水仙花數”得到:153,370,371,407。