我在下面的代码中尝试做的是使输入成为一个四位数字(如果还没有的话),然后按升序和降序对数字中的数字进行排序。 x
是升序,y
是降序。然后我想减去x
和y
,直到得到减法的结果6174
。
#include <stdio.h>
int main() {
int number, count = 0, digit, pow = 0, result = 1, counter, temp,
x = 0, y = 0, i, j, substract = 0, count1 = 0;
scanf("%d", &number);
while (substract != 6174 && substract >= 0) {
substract = 0;
if (count1 > 0) {
temp = substract;
} else {
temp = number;
}
while (temp > 0) {
digit = temp % 10;
temp = temp / 10;
count++;
}
if (count < 4) {
pow = 4 - count;
/* Calculate base^exponent */
for (counter = 0; counter < pow; counter++) {
result = result * 10;
}
number = number * result;
}
for (i = 9, j = 0; i >= 0 && j <= 9; i--, j++) {
int tmpNumber = number;
while (tmpNumber > 0) {
int digit = tmpNumber % 10;
if (digit == i) {
x *= 10;
x += digit;
} else
if (digit == j) {
y *= 10;
y += digit;
}
tmpNumber /= 10;
}
}
substract = x - y;
count++;
printf("\n x %d", x);
printf("\n y %d", y);
printf("\n substract %d", x - y);
}
return 0;
}
当我输入 3542
时,我期望的输出是这样的
输入:
3524
输出:
x 5432
y 2345
subtract 3087
x 8730
y 0378
subtract 8352
x 8532
y 2358
subtract 6174
但我得到的实际上是这样的:
输入:
3524
输出:
x 5432
y 2345
subtract 3087
x 54325432
y 23452345
subtract 30873087
我认为问题出在 x
和 y
上。我必须在某个时候将它们重置为零。但我不知道在哪里。我已经尝试了代码中的每个地方。如果有人知道我哪里做错了,我将非常感谢您的帮助。
最佳答案
程序失败有多种原因:
- 您没有为每次迭代将
x
和y
重置为0
result
也应重置为1
- 循环的初始阶段太复杂:您应该测试
substract
是否为0
或6174
以停止循环并存储substract
到循环结束时的number
。
这是一个更简单的版本,不需要让数字有 4 位数字:
#include <stdio.h>
int main(void) {
int number;
if (scanf("%d", &number) == 1 && number >= 0 && number < 10000) {
for (;;) {
int x = 0, y = 0, substract;
for (int i = 9, j = 0; i >= 0 && j <= 9; i--, j++) {
for (int tmp = number, n = 0; n < 4; n++) {
int digit = tmp % 10;
if (digit == i) {
x *= 10;
x += digit;
} else
if (digit == j) {
y *= 10;
y += digit;
}
tmp /= 10;
}
}
substract = x - y;
printf("x %d\n", x);
printf("y %d\n", y);
printf("substract %d\n", substract);
if (substract == 0 || substract == 6174)
break;
number = substract;
}
}
return 0;
}
关于4位数字的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259344/