哈喽大家好,我是保护小周ღ,本期为大家带来的是求“水仙花数”,此水仙花,非彼水仙花,一起来看看把~
编辑
题目:
求出0~100000之间的所有“水仙花数”并输出。
描述:
“水仙花数”是指一个n位数,其各位数字的n次方之和刚好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
注意范围是0~100000之间的所有符合描述的“水仙花数”。
思路解析:
根据描述,我们知道,各位数字的n次方之和刚好等于该数本身才能称之为“水仙花数”,先尝试判断一个数是否为水仙花数,怎么判断呢?
第一步:求出该数的位数n。
第二步:求出该数每一位的n次方之和。
第三步:判断该数字的n次方之和是否刚好等于该数本身
本次博主给大家带来两种解题方式,思路都是一样的,普通计数,递归计数。
普通计数:
//统计每一个数的位数intCount(intsize) { intn=0; while (size) { size=size/10; ++n; } returnn; } //判断是否为水仙花intIfDaffodil(inti,intn) { intsize=i; intsum=0; //判断是否为符合“水仙花”while (size!=0) { intssum=1; //ssum统计每一位的n次方for (intj=0; j<n; j++) { ssum*=size%10; } size=size/10; //sum统计各位的n次方之和sum+=ssum; } //各位数字的n次方之和确好等于该数本身if (sum==i) { return1; } else { return0; } } intmain() { //遍历区间for (inti=0; i<=100000; ++i) { //当程序执行IfDaffodil时,会先执行完作为“参数”的Count,等Count执行完毕再执行自己intsize=IfDaffodil(i, Count(i)); if (size==1) { printf("%d ",i); } else { continue; } } return0; }
编辑
递归计数:
//统计每一个数的位数intCount(intn) { if (n<10)//当该数只剩个位时,递归结束return1; elsereturnCount(n/10) +1; /*{n=n/10;return Count(n)+1;}*/} //计算每一位的n次方intPow(intx, intn) { if (n==0) return1; elsereturnpow(x, --n) *x;//x^n} intmain() { //遍历区间for (inti=0; i<100000; ++i) { intn=i; intsum=0; //判断是否为符合“水仙花”while (n) { //n % 10 拿到最后一位,然后根据本身的位数求次方sum+= (Pow((n%10), Count(i)));//Pow计算每一位的n次方n/=10; } if (sum==i) { printf("%d ", sum); } else { continue; } } return0; }
编辑感兴趣的朋友可以用博主的方法,或者是自己的方法做做这道题。
分享一个牛客网上类似的题目,大家也可以尝试着做一做。
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
编辑
如有侵权请联系修改删除!