水仙花數”:是指一個三位數,其各位數字的立方和等於該數本身數值。
例如:原數 : abc
個位數: c, 十位數:b ,百位數: a
則水仙花數的要求:abc = + + ; 滿足這樣條件的數均爲水仙花數,不滿足的則不是水仙花數。
思路:
要求水仙花數,首先就要知道其範圍要求:三位數,則範圍是[100, 999];
另外,需要滿足表達式,那麼我們就需要求出其對應的個位數,十位數,百位數。
怎麼去求得各對應位數呢?假設申請變量 a , b , c 分別代表百十個位,獲取一個數,假設爲 N。
對於求數存在多種表達方式,現在介紹一種較爲容易理解的方法
首先:怎麼獲取百位呢? 整數 N / 100 本應該帶小數,但類型屬於 int 型,強制轉換爲整數,則 百位 a = N /100;(451/100=4)
其次:怎麼求十位呢?將三位數除以10並強轉,將小數位(原數的個位數)去掉,現在數據的個位便是原數的十位,二位數再取10的餘,得到的餘數便是原數的十位。表達方式:b = N /10%10;(451/10=45;45%10=5)
然後:怎麼求個位呢?在求十位中應該有所發現,求餘可以得到。表達式:c = N %10;(451%10=1)
最後:怎麼算是否滿足呢?將水仙花數的滿足表達式進行代碼轉換就好了。
實現過程:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <strings.h>
int main()
{
int i=100; //申請變量並初始化,目的在於控制其範圍,也可以後面再賦值;
int a,b,c; //申請變量分別接收百十個位數;
while(i<=999) //進入循環體,控制具體範圍,也可以用for循環,表達方式有差異;
{
a=i/100; //求百位數
b=i/10%10; //求十位數
c=i%10; //求個位數
if(i==(pow(a,3)+pow(b,3)+pow(c,3))) //判斷是否滿足條件的表達式,pow 函數數標準C庫函數,用來求冪次方;
printf("%d\n",i);
i++;
}
return 0;
}
接下來我們看一下結果:
接下來,我們嘗試 for 循環:
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <math.h>
16 #include <strings.h>
17 int main()
18 {
19 int i=100;
20 int a,b,c;
21 // while(i<=999)
22 for(i=100;i<1000;i++) //for 循環,注意範圍(i<1000)等價於(i<=999)
23 {
24 a=i/100;
25 b=i/10%10;
26 c=i%10;
27 if(i==(pow(a,3)+pow(b,3)+pow(c,3))) //pow(a,3)也可以寫成 a*a*a ;
28 {
29 printf("%d\n",i);
30 // i++; //此處是我註釋掉的,原程序不需要,請思考如果i++會有什麼區別?爲什麼?
31 }
32 // i++; //此處是我註釋掉的,原程序不需要,請思考如果i++會有什麼區別?且與30行有什麼區別?爲什麼?
33 }
34 return 0;
35 }
結果如圖:
注意:1. 請思考for循環中兩處備註與原碼的區別,結論異同的原因;
2.for與while 循環時,代碼書寫區別。