求int范围所有的水仙花数以及获得丢掉各位,最高位的方法

     这个代码可以求int类型范围内的所有水仙花数,如果想要求更大范围内的水仙花数将int类型修改成longlong
就可以了
       思路:将一个数除以最高位的权重得到它最高位位上的数字,假设这个数是1345,他的权重就是10^3,
得到1,计算该位数字的立方并保存下来,然后再用这个数对最高位上的数字乘以他的权重的乘积求余,
也就是用1234对1000求余,可以消除最高位上的数字,也就是消除了1,得到345,将这个过程循环就可
以得到每个位上的数字,这个数字有多少位就循环多少次,至于这个数字有多位,可以将该数除以10,一直
到等于零为止,用一个变量计算除了多少次,这个变量的数就是消除最高位循环的次数,得到每个位上的数字,
计算出每个位的立方之和加起来与该数字比较,如果相等输出就可以。这样的循环只可以处理中间没有零的数,
如果中间含有0的话,就像1004,处理了最高位上的数字之后,还有三次循环,可是对1000求余之后就只剩了1
位数,所以还要处理循环次数真正循环的次数其实是不为零的位数,所以要判断一下中间是否有零,如果有零
就要处理循环次数;例如1024,就要将循环次数减少一次,1000就要将循环次数减少3次,104080,就要将循环
次数减少三次
代码如下:

#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就可以.

posted @ 2017-10-21 23:46  小乖不乖  阅读(464)  评论(0编辑  收藏  举报