求int範圍全部的水仙花數以及得到丟掉各位,最高位的方法

     這個代碼能夠求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

相關文章
相關標籤/搜索