для циклов и оператора по модулю - PullRequest
0 голосов
/ 17 февраля 2019

Напишите программу, которая вычисляет сумму цифр целого числа.Например, сумма цифр числа 2155 составляет 2 + 1 + 5 + 5 или 13. Программа должна принимать любое произвольное целое число, введенное пользователем.

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

#include <stdio.h>

int main(void)
{
    int i, num, sum = 0, temp;

    printf("Enter the number:\n");
    scanf("%i", &num);

    printf("Test for num: %i\n", num); //both num & temp return same number
    temp = num;
    printf("Test for temp: %i\n", temp);

    //while (num > 0)
    for (i = 0; i <= temp; i++)  //replacing temp w/ num will skip last num
    {
        sum += num % 10;
        //sum += right;
        num /= 10;
    }

    printf("Given number = %i\n", temp);
    printf("Sum of digits of %i = %i", temp, sum);

    return (0);
}

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Примечание:

for (i = 0; i <= temp; i++)

Это несправедливо - если temp, например, 543, , вы определенно не будете выполнять этот цикл 544 раза (несмотря на то, чторезультат в порядке, так как цикл в большинстве итераций добавляет только 0 к уже правильному результату).

Ваша программа с исходным циклом while

while (num > 0)
{
    sum += num % 10;
    num /= 10;
}

работает нормально для относительно небольшие числа , то есть в диапазоне int *) , я проверял его, например

Enter the number:
1234
Test for num: 1234
Test for temp: 1234
Given number = 1234
Sum of digits of 1234 = 10

или

Enter the number:
123456789
Test for num: 123456789
Test for temp: 123456789
Given number = 123456789
Sum of digits of 123456789 = 45

Но, например,

Enter the number:
10000000001
Test for num: 1410065409
Test for temp: 1410065409
Given number = 1410065409
Sum of digits of 1410065409 = 30

Вы можете видеть, что функция scanf() читает "большое" число 10000000001 как 1410065409!

Но это не проблема с логикой вашего цикла while, результат для числа 1410065409 правильный.


(*) - int диапазон для наиболее распространенных реализаций int (как 32-разрядные числа) равен

              from  -2.147.483.648  to  +2.147.483.647.
0 голосов
/ 17 февраля 2019

Сделайте это, распечатайте переменную i рядом с циклом for и посмотрите, как часто она выполняется.Это неэффективно и является пустой тратой ресурсов.

Вы также должны учитывать следующее?

Какова сложность времени?Чем отличается цикл while от цикла for с использованием temp?

Когда вы переключились на цикл for, вы не учитывали, что происходит, переменная num в цикле while.Предположим, число с n цифрами находится между 10^(n-1) включительно и 10^n исключительно.Если мы позволим n быть числом цифр в N, то неравенство будет 10^(n-1) <= N < 10^n.Отсюда мы находим, что сложность по времени равна O (log (n)).В числовом выражении примерно log10(num) цифр.

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

 for (i = temp ; i !=0; i /= 10)

Это было бы более правильным, если использовать цикл for.Это будет выполняться столько же раз, сколько и цикл while, но потребуется уменьшить значение i и проверить, если i != 0 для итерации.

0 голосов
/ 17 февраля 2019

Если вы закомментировали num в цикле for, вы рассчитываете i на дивиденды от исходного числа, а не num > 0.

Если у вас, например, num = 158, цикл будет выполнен, а затем установите num на 15. i увеличивается на 1. Таким образом, i

Если ваша старшая цифра больше или равна количеству цифр, ваш код с числом в цикле for будет работать.Иначе этого не будет.

Вы можете избавиться от i и просто использовать num в цикле for.

for(;num > 0; num /= 10)
    sum += num%10;
...