“水仙花数”和“完数”的实现

例题来源:谭浩强《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);
		}
	}
}

三个结合在一起即可完成题目要求
实现后运行结果如下在这里插入图片描述
今天就是这些内容,有问题,希望多提出来,可以私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值