这个代码可以求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就可以.
原文:http://www.cnblogs.com/smile-812/p/7707433.html