这是一个c程序,用于查找具有相同数字的下一个最大数字。但没有通过一个测试用例

时间:2018-08-17 18:05:05

标签: c debugging output

这是一个C程序,用于查找具有相同数字的下一个更大的数字。该程序适用于所有给定的测试用例(一个除外)。当输入为472时,预期输出为724。但是我的输出是247。谁能帮我找到错误?

我试图解决的逻辑是:

  1. 从最右边的数字开始遍历给定的数字,继续遍历直到找到一个比先前遍历的数字小的数字。例如,如果输入数字为534976,我们将停在4,因为4小于下一位数字9。如果找不到这样的数字,则输出为Not Possible

  2. 现在在上方找到的数字“ d”的右侧搜索大于“ d”的最小数字。对于5349764的右侧包含976。大于4的最小数字是6

  3. 交换上面找到的两位数,在上面的示例中我们得到536974

  4. 现在对所有数字进行排序,从“ 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]);
    }
}

1 个答案:

答案 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