输出水仙花数

题目:

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

标色的地方是容易忽略的。

解法一

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

int ws(int i)    //n判断i的位数
{
    int n = 0;
    while(i)
    {
        n++;
        i /= 10;
    }
    return n;
}

int sxh(int i)
{
    int n = ws(i),sum=0,m=i;
    while (i)
    {
        int k = i % 10;
        i /= 10;
        sum = sum + pow(k, n);  //每一位数的n次方之和
    }
    if (sum == m)     //水仙花数判断条件
        return sum;
    else return 0;

    
}

int main()
{
    int i;
    for (i = 0; i <= 100000; i++)
    {
        if(sxh(i))
        printf("%d\n", i);
    }
    return 0;
}

此处附上我在刚开始写代码出的错:

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

int ws(int i)    //n判断i的位数
{
    int n = 0;
    while(i)
    {
        n++;
        i /= 10;
    }
    return n;
}

int sxh(int i)
{
    int n = ws(i),sum=0;
    while (i)
    {
        int k = i % 10;
        i /= 10;
        sum = sum + pow(k, n);  //每一位数的n次方之和
    }
    if (sum == i)     //水仙花数判断条件
        return sum;
    
}

int main()
{
    int n,i;
    for (i = 0; i <= 100000; i++)
    {
        printf("%d\n", sxh(i));
    }
    return 0;
}

代码的目的是找出并打印在一定范围内(0到100000)的所有水仙花数(也称为阿姆斯特朗数)。但是有几个问题需要修正:

1. **`sxh`函数的返回值问题**:`sxh` 函数的目的是检查一个数是否是水仙花数,但不论是不是水仙花数,它都返回了 `sum`。正确的做法应该是仅在 `sum` 等于原始数值 `i` 时返回 `sum`,否则返回0或者一个特殊值(例如-1)表示不是水仙花数。

2. **变量作用域错误**:在 `sxh` 函数中,你在判断 `sum == i` 时,变量 `i` 已经在循环中被修改,变为0。你需要在改变 `i` 之前,用一个新变量保存原始的 `i` 值。

3. **输出格式**:你的主函数中无条件地打印了 `sxh(i)` 的返回值,这将包括很多0或者-1(取决于你如何修改 `sxh` 函数)。应该只打印那些是水仙花数的值。

以下是代码修改:

我已经修改了你的代码,主要修改如下:

1. 在 `sxh` 函数中,我增加了一个变量 `original` 来保存 `i` 的原始值。这样,即使 `i` 在循环中被改变,我们也可以使用 `original` 来判断是否是水仙花数。

2. 修改了 `sxh` 函数的返回值逻辑。现在它只在找到水仙花数时返回该数,否则返回0。

3. 在 `main` 函数中,我添加了一个条件判断,只有当 `sxh(i)` 返回非0值时,才打印该值。

修改后的代码如下:

```c
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>

int ws(int i)    // Function to determine the number of digits in i
{
    int n = 0;
    while(i)
    {
        n++;
        i /= 10;
    }
    return n;
}

int sxh(int i)
{
    int original = i;  // Save the original value of i
    int n = ws(i), sum = 0;
    while (i)
    {
        int k = i % 10;
        i /= 10;
        sum = sum + pow(k, n);  // Sum of each digit raised to the power n
    }
    if (sum == original)     // Check if it's a narcissistic number
        return sum;
    else
        return 0;   // Return 0 or -1 if not a narcissistic number
}

int main()
{
    int i;
    for (i = 0; i <= 100000; i++)
    {
        int result = sxh(i);
        if (result != 0)  // Print only if it's a narcissistic number
            printf("%d\\n", result);
    }
    return 0;
}
```

这样修改后,代码应该能正确地找出并打印出指定范围内的所有水仙花数。

解法二

思路:
此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。假定给定一个数据data,具体检测方式如下:
1. 求取data是几位数
2. 获取data中每个位置上的数据,并对其进行立方求和
3. 对data中每个位上的数据立方求和完成后,在检测其结果是否与data相等即可,
相等:则为水仙花数
否则:不是
具体实现参考以下代码。
*/
#include <stdio.h>
#include <math.h>

int main()
{
	int i = 0;
	for(i=0; i<=999999; i++)
	{
		int count = 1;
		int tmp = i;
		int sum = 0;
		//判断i是否为水仙花数
		//1. 求判断数字的位数
		while(tmp/10)
		{
			count++;
			tmp = tmp/10;
		}
     
		//2. 计算每一位的次方和
		tmp = i;
		while(tmp)
		{
			sum += pow(tmp%10, count);
			tmp = tmp/10;
		}
     
		//3. 判断
		if(sum == i)
			printf("%d ", i);
	}
	return 0;
}
  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值