Петли и по модулю - PullRequest
       1

Петли и по модулю

0 голосов
/ 27 апреля 2011

Я изучаю C, и мне трудно понимать циклы и использование по модулю.Я знаю, что циклы используются для сокращения программы, а модули - для вывода остатка.Моим заданием было «Написать программу на C, чтобы найти сумму отдельного положительного целого числа».

Я потратил несколько часов, пытаясь понять эту проблему.Я тоже экспериментировал.

    int  n,d=0,s=0;
    printf("\nEnter a number\n\n");
    scanf("%d",&n);</p>

<code>while(n>0)
     { 
           d = n%10;
       s = s+d;
       n = n/10;
     }

printf("\n sum of the individual digits = %d",s);
</code>

Мои вопросы:

Может кто-нибудь помочь мне понять ход этой программы?Почему используется модуль?и почему существует = n / 10

Эксперименты, которые я провел:

Когда я удалил d = n% 10;В строке вывода выводятся цифры seperatley.таким образом, это не расчет.

т.е. 123 = 6 -> Это дает мне 136

Когда я удалил строку, n = n / 10 Это не показывает вывод.У оператора printf есть параметр 's'

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 27 апреля 2011

Взятие по модулю в d = n % 10 делает d равным последней цифре n в базе 10. n = n / 10 удаляет последнюю цифру из n.

Модуло, по сути, берет остаток, так что скажем n = 123. Тогда n / 10 равно 12, а n % 10 равно 3.

Удаление n = n / 10 означает, что n не меняется между каждым запуском цикла, поэтому условие цикла n > 0 всегда выполняется и, следовательно, цикл продолжает работать до тех пор, пока вы не закроете программу вручную.

Вот след программы с n = 123. Первоначально d и s оба равны нулю.

 while (n > 0) {  // n is 123, which is greater than zero, so we enter the loop
     d = n % 10;  // 123 % 10 is 3, so d is now 3
     s = s + d;   // 0 + 3 is 3, so s is now 3
     n = n / 10;  // 123 / 10 is 12, so n is now 12.
 }                // go back to the top of the loop
 while (n > 0) {  // n is 12, which is still greater than zero
     d = n % 10;  // 12 % 10 is 2, so d is now 2
     s = s + d    // 3 + 2 is 5, so s is now 5
     n = n / 10;  // 12 / 10 is 1, so n is now 1
 }                // go back to the top again
 while (n > 0) {  // n is 1, which is still greater than zero
     d = n % 10;  // 1 % 10 is 1, so d is now 1
     s = s + d;   // 5 + 1 is 6, so s is now 6
     n = n / 10;  // 1 / 10 is 0, so n is now 0
 }                // go back to the top
 while (n > 0) {  // n is 0, which is not greater than zero, so we skip
                  // to after the loop body
 printf("\n sum of the individual digits = %d",s);
2 голосов
/ 27 апреля 2011

Представьте, что у вас есть лист бумаги с отверстием, достаточно большим, чтобы показать одну цифру.Чтобы получить сумму цифр, вы должны поместить эту бумагу поверх своего номера, чтобы отображались цифры.Вы записываете эту цифру куда-то вниз.Затем вы сдвигаете свой номер вправо, чтобы цифра десятков оказалась под отверстием.Вы добавляете это к предыдущей цифре, которую вы записали, и так далее до тех пор, пока не останется больше цифр.

Кусок бумаги с отверстием - это операция по модулю и скольжение числа вправо на каждомшаг - операция деления на 10.

И, чтобы привести конкретный пример вычисления:

Скажем, число 576.

576 % 10 = 6

, поэтому мы выбралиот 6, и мы добавляем это к текущей сумме 0, чтобы получить 6. Затем вы делите целочисленное деление на 10:

576 / 10 = 57

Теперь вы по модулю:

57 % 10 = 7

, поэтому мыЯ выбрал 7 и могу добавить это к промежуточной сумме 6, чтобы получить 13. Затем это целочисленное деление на 10 снова:

57 / 10 = 5

И снова по модулю:

5 % 10 = 5

Мы отобрали последнюю цифру и добавили ее к текущей сумме, чтобы получить 18 - сумму цифр.Затем мы снова делим на 10:

5 / 10 = 0

И так как это ноль, условие цикла (n > 0) теперь ложно, и мы заканчиваем.

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

0 голосов
/ 27 мая 2016

Попробуйте:

int n = 12;
printf("%d\n", n / 10);

int j = 12;
printf("%d\n", j % 10);

int x = 13;
x = x / 10;   // right hand side of "=" get evaluated first
printf("%d\n", x);

Наблюдайте вывод в каждом случае.

Относительно вашей последней точки:

while (n > 0)
{
    // some code.
}

Это означает: при значении n больше нуля, пробег some code.Теперь, если вы не измените n, some code будет работать вечно.НТН.

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