题目:
求出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; }