簡體   English   中英

從數字中找到3個連續數字的最大和

[英]Find the largest sum of 3 consecutive digits from number

我有一個編寫C程序的任務,該程序查找數字中3個連續數字的最大和。 我寫了它,但是我遇到了麻煩:該程序似乎可以正常工作,但是它沒有正確回答,而是輸入了一些奇怪的數字。 例如,如果輸入為“ 560315”,則響應為“ 155”。 但是,如果我鍵入“ 560415”,答案仍然是“ 155”,而如果我鍵入“ 561315”,則響應將更改為“ 156”。 編碼有問題嗎? 這是代碼:

#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;

            }
        }
    }

要解決此問題,每當您使用變量i值將其分配給算法變量: abcd ,都可以從i減去48 ,在這種情況下,示例560316的答案為11,我相信這是3個連續數字的最大和,這將起作用,因為48是數字0的ascii代碼,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個索引,第二個數字表示第一個索引,等等)和該前兩個索引(如果存在,則必須進行邊界檢查)。 然后,只需查找並打印陣列中最大的數字即可。

@TD涵蓋了主要問題:使用a = i - '0' '0 a = i - '0'而不是a = i (在4個地方)
@喬納·尼爾森(Jonah Nelson)確實指出嵌套有點過多。 下面是一個簡化的版本。
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;
}

如果您想要一個非常簡單的程序,則無需索引到數組中。 請記住最后兩位數字。 從而:

#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 */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM