#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
//n = 3;
int first = 0;
int num = 1;
while (first < n)
{
first++;
num *= 10;
}
//printf("num = %d\n",num);
int i = num/10;
while (i < num)
{
int d = 1;
int a = i;
int sum = 0;
do
{
d = a%10;
a /= 10;
int j = 1;
int p = d;
while (j < n)
{
p *= d;
j++;
sum += p;
}
} while (i > 0);
if (sum == i)
{
printf("%d\n",i);
}
i++;
}
}
```c
```
总共二个问题:
1.在第二个 do-while 循环中,循环条件应为 i > 0 而不是 a > 0。因为此处的目标是检查变量 i 是否大于零,以便正确地计算水仙花数。
2.在第二个 do-while 循环结束后,应将变量 sum 重置为零,以便在下一次迭代中使用。
这是给你修改后的代码:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int first = 0;
int num = 1;
while (first < n) {
first++;
num *= 10;
}
int i = num / 10;
while (i < num) {
int d = 1;
int a = i;
int sum = 0;
do {
d = a % 10;
a /= 10;
int j = 1;
int p = d;
while (j < n) {
p *= d;
j++;
}
sum += p;
} while (a > 0);
if (sum == i) {
printf("%d\n", i);
}
i++;
}
return 0;
}
而且你的代码用while嵌套太多了,不便于阅读代码,我帮你改进了一下代码
#include <stdio.h>
#include <math.h>
int main() {
int n;
printf("请输入位数:");
scanf("%d", &n);
int start = pow(10, n - 1);
int end = pow(10, n);
printf("%d位数的水仙花数有:\n", n);
for (int num = start; num < end; num++) {
int temp = num;
int sum = 0;
while (temp != 0) {
int digit = temp % 10;
sum += pow(digit, n);
temp /= 10;
}
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
如果对你有帮助给我个采纳谢谢