这是一个C程序,用于查找具有相同数字的下一个更大的数字。该程序适用于所有给定的测试用例(一个除外)。当输入为472
时,预期输出为724
。但是我的输出是247
。谁能帮我找到错误?
我试图解决的逻辑是:
从最右边的数字开始遍历给定的数字,继续遍历直到找到一个比先前遍历的数字小的数字。例如,如果输入数字为534976
,我们将停在4
,因为4
小于下一位数字9
。如果找不到这样的数字,则输出为Not Possible
。
现在在上方找到的数字“ d”的右侧搜索大于“ d”的最小数字。对于534976
,4
的右侧包含976
。大于4
的最小数字是6
。
交换上面找到的两位数,在上面的示例中我们得到536974
。
现在对所有数字进行排序,从“ d”旁边的位置到数字的末尾。排序后得到的数字就是输出。对于上面的示例,我们以粗体536974
对数字进行排序。我们得到536479
,这是输入534976
的下一个更大数字。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int N, dig[100], i = 0,j, temp, t, s, k, l, min, temp1;
scanf("%d", &N);
while (N > 0) {
dig[i] = N % 10;
i++;
N = N / 10;
}
for (j = 0; j <= i; j++) {
if (dig[j] > dig[j + 1]) {
s = j;
break;
}
}
min = dig[s];
//printf("%d ", min);
for (k = s; k >= 0; k--) {
if (dig[k] <= min) {
min = dig[k];
t = k;
}
}
//printf("%d ", t);
temp = dig[t];
dig[t] = dig[s + 1];
dig[s + 1] = temp;
for (k = 0; k <= s; k++) {
for (l = k + 1; l <= s; l++) {
if (dig[k] < dig[l]) {
temp1 = dig[k];
dig[k] = dig[l];
dig[l] = temp1;
}
}
}
for (k = i - 1; k >= 0; k--) {
printf("%d", dig[k]);
}
}
答案 0 :(得分:1)
您的算法似乎正确,但是循环不正确。一些索引边界偏离了一个,并且与<=
的比较不正确。通过增加10的幂来存储数字,而更实际的做法是违反直觉的,这会使算法转换成代码变得复杂。
这是更正的版本,它输出所有更大的数字。您可以通过以下方式轻松检查输出:通过sort -c
用管道输送来验证订单,并通过wc -l
输送管道以验证是否找到了所有组合(最多应该有 n!-1 个数字)表示具有 n 个数字的数字)。
#include <stdio.h>
int main() {
int N, dig[100], i, j, s, t, k, l, temp;
if (scanf("%d", &N) != 1 || N < 0)
return 1;
for (;;) {
for (i = j = 100; N > 0;) {
dig[--i] = N % 10;
N = N / 10;
}
for (s = j - 2; s >= i; s--) {
if (dig[s] < dig[s + 1]) {
break;
}
}
if (s < i) {
/* no greater number with the same digits */
break;
}
t = s + 1;
for (k = t + 1; k < j; k++) {
if (dig[k] < dig[t] && dig[k] > dig[s]) {
t = k;
}
}
temp = dig[t];
dig[t] = dig[s];
dig[s] = temp;
for (k = s + 1; k < j; k++) {
for (l = k + 1; l < j; l++) {
if (dig[k] > dig[l]) {
temp = dig[k];
dig[k] = dig[l];
dig[l] = temp;
}
}
}
N = 0;
for (k = i; k < j; k++) {
N = N * 10 + dig[k];
printf("%d", dig[k]);
}
printf("\n");
}
return 0;
}
输入:472
输出:
724
742