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