“水仙花数”和“完数”的实现
例题来源:谭浩强《C语言程序设计》第五版:习题5.8
输出所有“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1^ 3+ 5^ 3+ 3^3。
该题让输出所有水仙花数,首先我们知道它的范围肯定是>100||<1000,这才是三位数。那我们可以这样思考,先写出一个函数判断一个数到底是不是水仙花数,然后再利用这个函数循环一下100~1000的数字,便能得到所有水仙花数了。
判断是否为水仙花数的函数我们用bool类型来写,函数Isflower用来判断是否为符合条件的数。先取个位又是这个问题(n%10)来实现,再扔掉个位(n/10)来实现,他们取下来的每一位立方再相加。代码如下。
bool Isflower(int n)
{
int a=0;
int tmp=0;
int m=n;
for(int i=1;1<=n;i++)
{
a=n%10;
n/=10;
tmp+=a*a*a;
}
return tmp==m;
}
int main()
{
for(int i=100;i<1000;i++)
{
if(Isflower(i))
{
printf("%d\n",i);
}
}
return 0;
}
注意: a和tmp的定义很容易想到。当我们写道函数结尾写返回值的时候,发现n是变化的应该定义一个m(当然也可以是其他的)来存放n最开始的值,进入循环n开始变化。返回tmp和和三位数立方相等的情况。
上面写了水仙花数还有一个数字叫完数
例题来源:谭浩强《C语言程序设计》第五版:习题5.9
一个数如果恰好等于它的因子之和,称这个数为“完数”。例如:6的因子为1,2,3,而6=1+2+3。因此6是“完数”。编程找出1000以内的所有完数,并按照下列格式输出其因子:
6 its factors are 1,2,3
思考思路相同,我们先来考虑一下,写一个函数用来判断一个数字它是还不是完数。
这里没有写出测试用例,bool类型是则1否则0
bool Isperpectnum(int n)
{
int sum=0;
for(int i=1;i<n;i++)
{
if(n%i==0)
{
sum+=i;
}
}
return sum==n;
}
接下来要实现这个格式,代码如下。
void Show(int n)
{
printf("%d its factors are",n);
for(int i=2;i<n;i++)
{
if(n%i==0)
{
printf(" %d",i);
}
}
printf("\n");
}
下面是主函数,调用了两个自己写的函数完成题目要求,代码如下。
int main()
{
for(int i=1;i<1000;i++)
{
if(Isperpectnum(i))
{
Show(i);
}
}
}
三个结合在一起即可完成题目要求
实现后运行结果如下
今天就是这些内容,有问题,希望多提出来,可以私信我。
上一篇: 打印100到1000内水仙花数
下一篇: 水仙花数