функция, которая разбивает цифры, а затем суммирует их - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь решить проблему, которая требует, чтобы я взял номер.Используйте% и /, чтобы взять самый правый номер и суммировать разделенные цифры.Затем скажите, посмотрите, делится ли число на 9.

Я создал функцию, которая будет отделять крайнее правое число, а затем я попытался взять это число и запустить его через цикл while.Проблема, которая существует, когда я запускаю цикл while.Это создает бесконечный цикл, иначе выходные данные не будут напечатаны.

#include <stdio.h>

int loopnum(int n);

int main(void)
{
    int num;
    int sum = 0;
    int d = loopnum(num);

    printf("Enter a number:\n");
    scanf("%d", &num);

    while (loopnum(num) > 0) {
        printf("d = %d", d);
        printf(",sum = %d\n", sum);
    }

    if (num % 9 == 0) {
        printf("n = %d is divisible by 9\n", num);
    }
    else {
        printf("n = %d is not divisible by 9\n", num);
    }
    return 0;
}

int loopnum(int n)
{
    n = n % 10;
    n = n / 10;
    return n;
}
Enter a number:
9
n = 9 is divisible by 9

В результате этого кода предполагается вывести d = "цифра", сумма = "цифра + сумма" и n= "цифра" делится на 9. Например, если я введу 9. Выход будет d = 9, сумма = 9.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Функция не имеет смысла.

int loopnum(int n)
{
    n = n % 10;
    n = n / 10;
    return n;
}

Например, для n, равного 27, вы получите

n = n % 10;

, теперь n равно 7 и затем

n = n / 10;

теперь n равно 0.

Так что для числа 27 функция возвращает 0.

Более того, внутри цикла

while (loopnum(num) > 0) {
    printf("d = %d", d);
    printf(",sum = %d\n", sum);
}

не изменяется ни num, ни d, ни sum.

Нет особого смысла определять такую ​​функцию, за исключением того, что онамог бы сам выводить промежуточные суммы и цифры.

Без функции программа может выглядеть следующим образом.

#include <stdio.h>

int main(void) 
{
    while ( 1 )
    {
        const unsigned int Base    = 10;
        const unsigned int DIVISOR = 9;

        printf( "Enter a non-negative number (0 - exit): " );

        unsigned int n;

        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

        unsigned int sum = 0;

        unsigned int tmp = n; 
        do
        {
            unsigned int digit = tmp % Base;
            sum += digit;

            printf( "d = %u, sum = %u\n", digit, sum );
        } while ( tmp /= Base );

        printf( "\nn = %u is %sdivisble by %u.\n\n", 
                 n, 
                 sum % DIVISOR == 0 ? "" : "not ", DIVISOR );

    }

    return 0;
}

Его выходная мощность может выглядеть как

Enter a non-negative number (0 - exit): 9
d = 9, sum = 9

n = 9 is divisble by 9.

Enter a non-negative number (0 - exit): 123456
d = 6, sum = 6
d = 5, sum = 11
d = 4, sum = 15
d = 3, sum = 18
d = 2, sum = 20
d = 1, sum = 21

n = 123456 is not divisble by 9.

Enter a non-negative number (0 - exit): 0
0 голосов
/ 18 июня 2019

Код loopnum неверен.Он всегда будет возвращать ноль, и поэтому while не будет зацикливаться.

int loopnum(int n)
{
    n = n % 10;  // After this n is a number between 0 and 9
    n = n / 10;  // Consequently, when you divide by 10 you'll end up with zero
    return n;
}

Ваша конструкция требует двух вещей:

1) Вернуть остаток

2) Изменитьn

Для этого вам нужно передать указатель на n.

Что-то вроде:

int loopnum(int *n)
{
    int res = *n % 10; 
    *n = *n / 10;
    return res;
}

int main(void)
{
  int x = 123;
  int sum = 0;
  while(x) sum += loopnum(&x);
  printf("%d\n", sum);
  return 0;
}
...