這個代碼能夠求int類型範圍內的全部水仙花數,若是想要求更大範圍內的水仙花數將int類型修改爲longlong
就能夠了
思路:將一個數除以最高位的權重獲得它最高位位上的數字,假設這個數是1345,他的權重就是10^3,
獲得1,計算該位數字的立方並保存下來,而後再用這個數對最高位上的數字乘以他的權重的乘積求餘,
也就是用1234對1000求餘,能夠消除最高位上的數字,也就是消除了1,獲得345,將這個過程循環就可
以獲得每一個位上的數字,這個數字有多少位就循環多少次,至於這個數字有多位,能夠將該數除以10,一直
到等於零爲止,用一個變量計算除了多少次,這個變量的數就是消除最高位循環的次數,獲得每一個位上的數字,
計算出每一個位的立方之和加起來與該數字比較,若是相等輸出就能夠。這樣的循環只能夠處理中間沒有零的數,
若是中間含有0的話,就像1004,處理了最高位上的數字以後,還有三次循環,但是對1000求餘以後就只剩了1
位數,因此還要處理循環次數真正循環的次數實際上是不爲零的位數,因此要判斷一下中間是否有零,若是有零
就要處理循環次數;例如1024,就要將循環次數減小一次,1000就要將循環次數減小3次,104080,就要將循環
次數減小三次
代碼以下:spa
#include <stdio.h> int aaa (int x,int y) { int tmp=1; for(int i=0;i<y;i++) { tmp*=x; } return tmp; } void narcissistic (int x,int y) { int i; // 循環次數 int tmp; //保存原整數 int ch; //保存當前數的第一位 double p; //當前數最高位的值乘以他的權重 int count=0; //存儲每一位立方之和 int n; //循環範圍內的整數值 int k; //對此時的整數進行整除循環,判斷如今還有多少位 int j; int ab; int h; for(j=x;j<y;j++) { n=j; ab=j; for(h=0;ab>0;h++) { ab/=10; } for (i=h;i>0;i--) { ch=int(n/(aaa(10,i-1))); //將整數除以他的最高權重 count+=(aaa(ch,h)); //保存當前最高位的值的立方 p=(ch*aaa(10,i-1)); //計算出該數最高權重乘以他最高位的值 n=(int)n%(int)p; //將整數對p求餘,消除最高位的數字 tmp=n; for(k=0;n>0;k++) { n/=10; } n=tmp; if(k!=(i-1)) { i=(k+1); } } if (count==j) { printf ("%d\n",count); } count=0; } } int main () { narcissistic (100,1000000); printf("\n"); return 0; }
從以上代碼中咱們能夠看出:
得到一個整數的位數的方法:將該數除以10,直到該數爲零,除了多少次就是該數的位數。
得到一個整數最高位的方法:將該數除以他的權重。
消除一個整數的最高位:得到最高位位的數字,將該數字乘以他的權重,而後再用該整數對其求餘,就能夠消除最高位
上的數字。
若是想要獲得個位數字的話,能夠對10求餘。
丟掉個位數字:對該數字除以10就能夠.code