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

Posted 小乖不乖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求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就可以.

以上是关于求int范围所有的水仙花数以及获得丢掉各位,最高位的方法的主要内容,如果未能解决你的问题,请参考以下文章

水仙花数c语言

C语言1~10000之间所有水仙花数

输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1*+5*+3

C语言怎样编输出所有水仙花数范围100到999

c语言编程题打印出所有的“水仙花数”所谓“水仙花数”是指一个三位数其各位数字立方和等于该数本身

JS for循环计算 经典例题 : 水仙花数