2013-12-02 3 views
0

У меня есть задача написать программу на C, которая найдет наибольшую сумму из 3 последовательных цифр в цифрах. Я написал это, но у меня проблемы: программа работает нормально, но вместо правильного ответа она набирает некоторые странные числа. Например, если вход «560315», ответ «155». Однако, если я наберу «560415», ответ будет по-прежнему «155», и если я наберу «561315», ответ изменится на «156». Это проблема с кодировкой? Вот код:Найдите самую большую сумму из 3 последовательных цифр от числа

#include <stdio.h> 
int isempt(int a) { 
if ((a==' ')||(a=='\n')||(a=='\t')) { 
    return 1; 
} 
else return 0; 
} 

main() { 
int a, b, c, d, e, i, maxsum; 
a = 0; 
b = 0; 
c = 0; 
d = 0; 
maxsum = 0; 
i = 0; 
int counter = 0; //the variables "numsearch" and "inside" indicate whether program is in the number or outside it 
int numsearch = 1; 
int inside = 0; 
while ((i = getchar())!=EOF) { 
    if (numsearch==1) { 
     if (isempt(i)==0) { 
      numsearch = 0; 
      inside = 1; 
      a = i; 
      counter++; 
     } 
     } 
    else if ((isempt(i)==0)&&(inside==1)) { 
      if (counter == 1) { 
       b = i; 
       counter++; 
      } 
      else if (counter == 2) { 
       c = i; 
       counter++; 
      } 
      else if (counter == 3) { 
       d = i; 
       maxsum = a+b+c; 
       if ((b+c+d) > maxsum) { 
        maxsum =(b+c+d); 
       } 
       a =b; 
       b = c; 
       c = d; 
       counter++; 
      } 
      else if (counter == 4) { 
       d = i; 
       if ((b+c+d)>maxsum) { 
        maxsum = b+c+d; 
       } 
       a=b; 
       b=c; 
       c=d; 
      } 

      } 
     else if ((counter>=3)&&(isempt(i)==1)) { 
       printf("\n%d\n", maxsum); 
       counter = 0; 
       numsearch = 1; 
       inside = 0; 
       a = 0; 
       b = 0; 
       c = 0; 
       d = 0; 
      } 
      else { 
       counter = 0; 
       numsearch = 1; 
       inside = 0; 
       a = 0; 
       b = 0; 
       c = 0; 
       d = 0; 

      } 
     } 
    } 
+0

Он предназначен для поиска трех крупнейших цифр, а затем их суммирования? поэтому 560315 должен произвести 16? –

+2

Вы вычисляете значения символов ASCII, а не цифры! –

+0

@TomTanner Нет. Я считаю, что ответ должен быть 11, это сумма 560 –

ответ

2

У вас так много вложенных условных, что я думаю, вы можете ввести в заблуждение себя. Я считаю, что было бы проще сделать массив целых чисел, и каждый индекс массива инициализируется до нуля. Затем добавьте цифру, указанную индексом плюс один (первая цифра до 0-го индекса, вторая цифра до 1-го индекса и т. Д.) К этому индексу и двум предыдущим индексам (если они существуют, вам нужно будет проверить границы). Затем просто найдите и напечатайте наибольшее число в массиве.

+0

Я признаю, что программа выглядит запутанной (с условием переключения и массивами она будет выглядеть лучше), но проблема в неправильном выходе. Все дело в том, как ведут себя переменные «maxsum» и «a, b, c, d». –

+0

Я считаю, что вы не печатаете сумму, а скорее выглядит странно отсортированным списком целых чисел, где наибольшее целое число переписывается наименьшим целым числом (часто происходит с ошибками по отдельности в алгоритмах сортировки). Недостаточная трудность при чтении кода способствовала ошибкам, которые вы не можете легко найти, это то, к чему я обращался. – ciphermagi

4

, чтобы решить эту проблему, вы можете вычесть 48 из i каждый раз, когда вы используете значение переменной i, чтобы назначить его на переменные вашего алгоритма: a, b, c, d, в этом случае ответ на ваш пример 560316 будет 11, и я считаю, что это самая большая сумма из трех последовательных цифр. Это будет работать, потому что 48 - это код ascii цифры 0, 49 для цифры 1 и т. д., поэтому ваш код должен быть таким:

 #include <stdio.h> 
     int isempt(int a) { 
     if ((a==' ')||(a=='\n')||(a=='\t')) { 
      return 1; 
     } 
     else return 0; 
     } 

     void main() { 
     int a, b, c, d, e, i, maxsum; 
     a = 0; 
     b = 0; 
     c = 0; 
     d = 0; 
     maxsum = 0; 
     i = 0; 
     int counter = 0; //the variables "numsearch" and "inside" indicate whether program is in the number or outside it 
     int numsearch = 1; 
     int inside = 0; 
     while ((i = getchar())!=EOF) { 
      if (numsearch==1) { 
       if (isempt(i)==0) { 
        numsearch = 0; 
        inside = 1; 
        a = i - '0'; 
        counter++; 
       } 
       } 
      else if ((isempt(i)==0)&&(inside==1)) { 
        if (counter == 1) { 
         b = i - '0' ; 
         counter++; 
        } 
        else if (counter == 2) { 
         c = i - '0'; 
         counter++; 
        } 
        else if (counter == 3) { 
         d = i - '0'; 
         maxsum = a+b+c; 
         if ((b+c+d) > maxsum) { 
          maxsum =(b+c+d); 
         } 
         a =b; 
         b = c; 
         c = d; 
         counter++; 
        } 
        else if (counter == 4) { 
         d = i - '0' ; 
         if ((b+c+d)>maxsum) { 
          maxsum = b+c+d; 
         } 
         a=b; 
         b=c; 
         c=d; 
        } 

        } 
       else if ((counter>=3)&&(isempt(i)==1)) { 
         printf("\n%d\n", maxsum); 
         counter = 0; 
         numsearch = 1; 
         inside = 0; 
         a = 0; 
         b = 0; 
         c = 0; 
         d = 0; 
        } 
        else { 
         counter = 0; 
         numsearch = 1; 
         inside = 0; 
         a = 0; 
         b = 0; 
         c = 0; 
         d = 0; 

        } 
       } 
      } 
+0

Спасибо, проблема в том, что программа рассчитала коды ASCII номеров! Но это действительно странно, все программы, которые я написал, прежде чем рассчитывать числа правильно, и если бы я хотел видеть код ASCII, я просто помещал его в одинарные кавычки. –

+0

@Alexei Но здесь, в этой программе, вы назначаете символ целому числу, ясно, что это значение кода ASCII, которое будет назначаться вместо значения значащей цифры, я не знаю о других случаях, когда это будет работать как вы упомянули в своих предыдущих программах, я не сталкивался с этим! –

+3

Вместо того, чтобы использовать магическое число ('48'), я бы рекомендовал использовать смещение для 1-го символа напрямую:' int ('0') '. Это делает его более читаемым, что происходит. –

1

@TD имеет основную проблему, которая хорошо освещена: используйте a = i - '0', а не a = i. (в 4 местах)
@ Джона Нельсон указывает, что вложенность немного чрезмерна. Далее следует упрощенная версия.
Код OP имеет проблемы с текстом, который не является ни пробелом, ни цифрами.

#include <stdio.h> 
#include <ctype.h> 

int main() { 
    int ch; 
    int index = 0; 
    char history[2]; 
    int maxsum = -1; 
    int sum = 0; // running sum 
    while ((ch = getchar()) != EOF) { 
    if (isdigit(ch)) { 
     ch -= '0'; // Convert text code to `int` value. 
     sum += ch; 
     if (index >= 2) { 
     if (sum > maxsum) { 
      maxsum = sum; 
     } 
     sum -= history[0]; 
     history[0] = history[1]; 
     history[1] = ch; 
     } 
     else { 
     history[index++] = ch; 
     } 
    } 
    else { 
     if (!isspace(ch)) { 
     printf("Unexpected text '%c'\n", ch); 
     } 
     index = 0; 
     sum = 0; 
    } 
    } 
    printf("Maximum sum: %d\n", maxsum); 
    return maxsum < 0; 
} 
0

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

#include <stdio.h> 
#include <ctype.h> 

int main() 
{ 
    int ch; 
    int count = 0; 
    int first = 0; 
    int second = 0; 
    int sum = 0; /* running sum */ 
    int max_sum = 0; /* max sum */ 
    while (ch = getchar(), ch != EOF) 
    { 
     if (isdigit(ch)) 
     { 
      ++count; 
      ch -= '0'; /* Convert text code to `int` value. */ 
      sum += ch; 
      if (sum > max_sum) 
      { 
       max_sum = sum; 
      } 
      sum -= first; 
      first = second; 
      second = ch; 
     } 
     else 
     { 
      printf("Ignored unexpected text '%c'\n", ch); 
      /* Optionally reset first, second, sum and count to 0 */ 
     } 
    } 
    printf("Maximum sum: %d\n", max_sum); 
    return count < 3; /* Didn't get enough characters */ 
} 
+0

Не будет ли этот счет 18 на строке '' 99'', позволяя считать 3 последовательную последовательность как потенциальную 'max_sum'? Я думаю, вы хотите 'if ((count> = 3) && (sum> max_sum)))' – chux

+0

Это то, что для 'return count <3 'для. неясно, что должно произойти, если ввод слишком короткий или нечисловый. И как бы вы различали «0», «00» и «000»? –

+0

В образце кода OP есть 'isempt()' для использования выделенных пробелов в качестве разделителей последовательных последовательностей цифр. OP-код специально проверяет «max_sum» после того, как найдены 3 последовательных цифры, переиздание в пробеле. Я бы различал «00» и «000» с возвращаемым значением ошибки -1 (или сообщение) и законным возвратным значением 0. Согласитесь о некоторой двусмысленности в сообщении OP. – chux

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