2016-08-30 4 views
0

Мне нужно найти сумму цифр числа. Например, сумма цифр номера 1123 1 + 1 + 2 + 3 = 7Найдите сумму цифр числа (в с)

Моя идея:

1) Пользователь вводит и целое число

2) рассчитать количество цифры в цифрах (в случае выше - 4 цифры)

3) Вместо использования для цикла я делю число пользователей на 10 на мощность 1,2 ... до количества цифр (не считая последнего) и суммируем числа.

Вот мой код:

int main (void) 
{ 
    int result,sum,n; 
    int div = 10,counter = 0,number; 

    printf("Enter the integer:"); 
    scanf("%i",&number); 
    while(result >0){ 
     result = number/div; 
     div *= 10; 
     ++counter; 
    } 
    printf("The number consists of %i digits\n",counter); 
    sum = 0; 

    for(n=1;n<counter;++n){ 
     sum += number/pow(10,n); 
    } 
    printf("%i",sum); 

    return 0; 


} 

первая часть (в то время как петля) отдельно работает правильно. Но вместе со второй частью (для цикла) это дает мне неправильный результат (0 цифр из цикла while и сумма также равна нулю). Можете ли вы объяснить, почему это происходит? Как я могу исправить свое решение?

P.S Я знаю, что существуют более эффективные решения моей проблемы, но я хочу использовать свой собственный алгоритм.

+1

не следует вводить непосредственно в междунар. ввод как строка. что делает вычисление длины тривиальным, а затем вы обрабатываете строку как char aarray и loop на отдельных цифрах, преобразуя их в int и добавляя –

+0

. Делясь по степеням '10', вы не получите цифр. Вам нужно использовать модуль '10' вместе с ним. –

+0

'div * = 10;' будет проблемой после ее переполнения. – chux

ответ

2

Несколько проблем здесь:

  • При первом входе в цикл while, result не инициализированы. Попытка прочитать неинициализированную переменную - undefined behavior.
  • Когда вы выполняете разделение, вы не добавляете цифры. Вы добавляете число, разделенное последовательными степенями 10. В случае 1123 вы фактически добавляете 112 + 11 + 1. Для получения цифр вам нужно использовать модуль вместо деления.

Вы можете сделать добавление и подсчет цифр в одном цикле следующим образом:

sum = 0; 
while(number > 0){ 
    sum += number % 10; 
    number /= 10; 
    ++counter; 
} 
printf("The number consists of %i digits\n",counter); 
printf("%i",sum); 
1

гораздо проще:

result = number; 
sum = 0; 
counter = 0; 
while(result != 0){ 
    sum += result % 10; 
    result /= 10; 
    ++counter; 
} 

printf ("Counter:%d sum:%d\n", counter, sum); 
0

Есть много ошибок в коде, но в целом весь подход является неправильным. Подсчет цифр не нужен.

Более простой способ будет:

unsigned temp = number, sum = 0; 
while (temp) { 
    sum += temp % 10; 
    temp /= 10; 
} 

Обратите внимание, что вы знаете, когда остановить цикл, потому что temp становится 0 (temp как условие эквивалентно temp != 0). Вам не нужно знать количество цифр заранее.

0

Если происходит с вашим кодом, это будет работать:

for(n=1;n<=counter;++n){ 
    sum += number%10; 
    number /= 10; 
} 
printf("%d",sum); 
1

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

Выполнять отладку, вычислять и печатать цифру отдельно от ее накопления.То есть, вместо того, чтобы sum += <... complex code ...>, сделать это следующим образом:

int digit = ... 
printf("Next digit is %i\n", digit); 
sum += digit; 

Также (вы должны обнаружить это путем отладки, но это достаточно очевидно, непосредственно внимание), ваш алгоритм для вычисления цифр неправильно. Сделайте что-то вроде этого:

int div = 1; 
for (...) 
{ 
    digit = number/div % 10; 
    div *= 10; 
} 

Обратите внимание, что я не использую pow здесь, потому что pow использует арифметику с плавающей точкой, которая имеет ограниченную точность. Если ваш int имеет 64 бита точности (маловероятно, но возможно), плавающая точка будет вычислять бессмыслицу для больших чисел (она имеет только 53 бит точности).

+0

Хорошее понимание ограничений 'pow()'. – chux

0

Simpler решение:

int c, n=0, sum=0; 
printf("Enter number"); 
while((c=getchar())!='\n') { // IMPORTANT: '\n' in unix, '\r' in windows 
    if(c<'0' || c>'9') { 
     printf("Bad value"); 
     break; 
    } 
    sum+=c-'0'; // c is the ASCII code of the digit, so you have to subtract an offset 
    n++; 
} 
printf("Number of digits: %d", n); 
printf("Sum of digits: %d", sum; 
+0

спасибо, я исправил их, а также добавил, если проверить, действительно ли символ действительно цифра. –

+0

Справа. Это если (c <'0' || c> '9'). Многие ошибки ввода сегодня ... –

+0

Вы можете использовать 'isdigit (char)' функцию, чтобы проверить, является ли это числом, и 'atoi (char *)', чтобы получить целое число из char – Tiko

Смежные вопросы