首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从number中找出3个连续数字的最大和

从number中找出3个连续数字的最大和
EN

Stack Overflow用户
提问于 2013-12-03 01:56:54
回答 4查看 1.1K关注 0票数 0

我有一个任务是写一个C程序,找出数字中3个连续数字的最大和。这是我写的,但我遇到了麻烦:程序似乎运行得很好,但它并没有输入正确的答案,而是键入了一些奇怪的数字。例如,如果输入为"560315",则响应为"155“。但是,如果我键入"560415“,答案仍然是"155”,如果我键入"561315“,则响应将更改为"156”。这是编码的问题吗?代码如下:

代码语言:javascript
复制
#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;

            }
        }
    }
EN

回答 4

Stack Overflow用户

发布于 2013-12-03 02:16:46

要解决这个问题,您可以在每次使用变量i的值将其赋给算法的变量时从i中减去48abcd,在这种情况下,示例560316的答案将是11,我相信它是3个连续数字的最大和,这是可行的,因为48是数字0的ascii代码,49是数字1的ascii代码,因此您的代码应该是这样的:

代码语言:javascript
复制
        #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;

                    }
                }
            }
票数 4
EN

Stack Overflow用户

发布于 2013-12-03 02:02:25

你有这么多嵌套的条件句,我想你可能把自己搞糊涂了。我相信创建一个整数数组会更容易,并且在数组的每个索引处初始化为零。然后将索引指示的数字加1(第一个数字到第0个索引,第二个数字到第一个索引,等等)到该索引和前面的两个索引(如果它们存在,您必须进行边界检查)。然后只需找到并打印数组中最大的数字。

票数 2
EN

Stack Overflow用户

发布于 2013-12-03 07:16:38

@T-D很好地涵盖了主要问题:使用a = i - '0'而不是a = i。(在4个地方)

@Jonah Nelson确实指出嵌套有点过了。下面是一个简化的版本。

操作码在处理既不是空格也不是数字的文本时确实有问题。

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20334746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档