Как сохранить множественное значение printf в переменной? - PullRequest
0 голосов
/ 11 мая 2019

Программа должна принимать целое число N с четным числом цифр в качестве ввода.
Программа должна инвертировать каждые две цифры в N и печатать измененное N в качестве выходного.

Граничное условие (я): 10 <= N <10 ^ 16 <br> Формат ввода: первая строка содержит N.
Формат вывода: первая строка содержит измененный N.

Пример ввода / вывода 1:
Ввод: 214587
Выход: 125478

Объяснение: Первые две цифры - это 2 и 1, которые обращены как 1 и 2. Вторые две цифры - это 4 и 5, которые обращены как 5 и 4. Третьи две цифры - это 8 и 7, которые обращены как 7 и 8.

Пример ввода / вывода 2:
Ввод: 504786
Выход: 57468

Я перешел на логику печати значений внутри цикла while, напечатав b/10 и b%10;, где вывод должен быть обратным, и я застрял в нем, пожалуйста, помогите в моей логике, как действовать дальше, спасибо .

scanf("%d",&a);
while(a>0) {
    b=a%100;
    printf("%d%d",b/10,b%10);
    a=a/100;
}

1 Ответ

0 голосов
/ 11 мая 2019

Как я отметил в трех комментариях ( 1 , 2 , 3 ), я думаю, что вам нужно использовать рекурсию и некоторую осторожность.Вот код, который работает, и тестовый набор (который больше, чем код, который тестируется), демонстрирующий, что он работает:

#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

static bool reverse_digit_pairs(uint64_t value)
{
    uint64_t b = value % 100;
    uint64_t v = value / 100;

    if ((v > 0 && v < 10) || (v == 0 && b < 10))
        return false;

    int t = b / 10;     // tens
    int u = b % 10;     // units
    bool ok = true;
    if (v >= 10)
        ok = reverse_digit_pairs(v);
    if (ok)
    {
        if (u == 0 && v == 0)
            printf("%d", t);
        else
            printf("%d%d", u, t);
    }
    return ok;
}

static void test_reverse_digit_pairs(uint64_t v)
{
    printf("V: %20" PRIu64 " = ", v);
    if (!reverse_digit_pairs(v))
    {
        fprintf(stderr, "Odd number of digits in %" PRIu64 "\n", v);
        printf("bogus input");
    }
    putchar('\n');
    fflush(0);   // Ensure standard output (and standard error) are flushed.
}

int main(void)
{
    test_reverse_digit_pairs(UINT64_C(214587));             // 125478 per question
    test_reverse_digit_pairs(UINT64_C(504786));             // 57468  per question
    test_reverse_digit_pairs(UINT64_C(5047000086));         // Pairs of zeros
    test_reverse_digit_pairs(UINT64_C(5047900086));         // Pair of zeros
    test_reverse_digit_pairs(UINT64_C(1234567890123456));   // 16 digits
    test_reverse_digit_pairs(UINT64_MAX);                   // 20 digits
    test_reverse_digit_pairs(UINT64_C(123456789012345));    // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(0));                  // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(1));                  // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(9));                  // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(10));                 // 2 digits
    test_reverse_digit_pairs(UINT64_C(99));                 // 2 digits
    test_reverse_digit_pairs(UINT64_C(100));                // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(999));                // Odd digits - failure
    test_reverse_digit_pairs(UINT64_C(1000));               // 4 digits
    test_reverse_digit_pairs(UINT64_C(1098));               // 4 digits
    test_reverse_digit_pairs(UINT64_C(1234));               // 4 digits
    return 0;
}

Вывод, который я получаю из этого:

V:               214587 = 125478
V:               504786 = 57468
V:           5047000086 = 574000068
V:           5047900086 = 574090068
V:     1234567890123456 = 2143658709214365
V: 18446744073709551615 = 81447644707390556151
Odd number of digits in 123456789012345
V:      123456789012345 = bogus input
Odd number of digits in 0
V:                    0 = bogus input
Odd number of digits in 1
V:                    1 = bogus input
Odd number of digits in 9
V:                    9 = bogus input
V:                   10 = 1
V:                   99 = 99
Odd number of digits in 100
V:                  100 = bogus input
Odd number of digits in 999
V:                  999 = bogus input
V:                 1000 = 100
V:                 1098 = 189
V:                 1234 = 2143

Тестовые случаи для цифр от 1 до 4 цифр были необходимы для устранения некоторых проблем.Я не совсем доволен первым условием в reverse_digit_pairs(), но я не получил вывод, который, по-моему, необходим, когда попробовал некоторые упрощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...