Почему этот код не работает, когда я использую 23 в качестве ввода? - PullRequest
2 голосов
/ 12 июня 2019

Цель кода - найти наименьшее возможное кратное, состоящее только из 9 и 0 положительного целого числа. Не знаю, почему это работает для всех чисел меньше 23, но не 23. Мы ценим любую помощь.

#include <stdio.h>

int main(int argc, char * argv[]){
    int n, check, i, numlen, j, digit;
    i = 2;
    check = 0;

    scanf("%d", &n);

    while(check == 0){
        numlen = 0;
        n = n * i/(i-1);
        j = n;
        while(j > 0){
            j /= 10;
            numlen++;
        }
        j = n;
        while(numlen > 0){
            digit = j % 10;
            j = j / 10;
            numlen --;
            check = 1;
            if (!(digit == 0 || digit == 9)){
                numlen = 0;
                check = 0;
            }
        }
        i ++;
    }
    printf("%d\n", n);
}

1 Ответ

1 голос
/ 12 июня 2019

Ваш способ вычисления кратных n делать n = n * i/(i-1); неверен, поэтому, по крайней мере, для 23 вы думаете, что вы найдете кратное 23, состоящее из 0 и 9, но это число не кратно23.

Исправленная версия вашего предложения, проверяющая кратное от n до решения, может быть:

#include <stdio.h>

int main(void)
{
  int n;

  if ((scanf("%d", &n) == 1) && (n > 0)) {
    int multn;

    for (multn = n; ; multn += n) {
      /* only 9 and 0 ? */
      int j;

      for (j = multn; j > 0; j /= 10) {
        int digit = j % 10;

        if ((digit != 0) && (digit != 9))
          break;
      }
      if (j == 0)
        /* only 9 and 0 ! */
        break;
    }

    printf("%d -> %d (remainder = %d)\n", n, multn, multn%n);
  }
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
1
1 -> 9 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
2
2 -> 90 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
3
3 -> 9 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
23
23 -> 990909 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
32
32 -> 900000 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
11111111
11111111 -> 99999999 (remainder = 0)
pi@raspberrypi:/tmp $ ./a.out
12345678
12345678 -> 9900900 (remainder = 9900900)
pi@raspberrypi:/tmp $ 

Примечание: последняя попытка вызывает переполнение ( int на 32b), и результат неверен, но нет гарантии, что программа завершится в случае переполнения.

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