水仙花数中的我的思维错误与修正

#include <math.h>
int main()
{
	for (int i = 1; i <= 100000; i++)
	{
		int count = 0;
		int sum = 0;
		int tmp = i;
		while (tmp)//判断水仙花数的位数
		{
			tmp /= 10;
			count++;
		}
		tmp = i;
		while (tmp)
		{
			int shui= pow(tmp % 10, count);
			sum = sum + shui;
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

大家注意:1.由于for是使用了个while,while中的判断条件是由i决定的,我的想法是第一个while判断用i,第二个判断之前用一个变量tmp来接收i(我以为这样的话i就是原来的值了,然而不是。)

错误的代码和结果:

int main()
{
	for (int i = 1; i <= 100000; i++)
	{
		int count = 0;
		int sum = 0;
		
		while (i)//判断水仙花数的位数
		{
			i /= 10;
			count++;
		}
		int tmp = i;
		while (tmp)
		{
			int shui= pow(tmp % 10, count);
			sum = sum + shui;
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

经过调试,我才明白 当把i放到while判断条件里的时候i就已经改变,即使后面用tmp再来储存也无济于事

所以我们的中心思想是i除了执行for自增之外,不能再改变,所以就有了开头的代码。

所以在一开始我们就要用tmp来储存i,在第二个判断之前 只需将tmp重新赋予i的值就行了。

2.还有一个细节第一个while的判断条件一般的答案是这样的

仔细思考一下,只要将tmp/10改成tmp,count改成0,就是一样的效果。而且还更加简便。 

3.再仔细一想,用函数封装的思想就不会有这种问题。

#include <math.h>
int countN(int i)
{
	int count = 0;
	while (i)
	{
		i /= 10;
		count++;
	}
	return count;
}

int is_shui(int i, int n)
{
	int sum = 0;
	while (i)
	{
		sum += pow(i % 10, n);
		i /= 10;
	}
	return sum;
}


int main()
{
	for (int i = 0; i <= 100000; i++)
	{
		int n = countN(i);//判断是几位数
		int ret = is_shui(i, n);//判断是否为水仙花数
		if (i == ret)
		{
			printf("%d ", ret);
		}
	}
	return 0;
}

希望我的修正与整理能帮到大家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值