我有一个任务是写一个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;
}
}
}发布于 2013-12-03 02:16:46
要解决这个问题,您可以在每次使用变量i的值将其赋给算法的变量时从i中减去48:a,b,c,d,在这种情况下,示例560316的答案将是11,我相信它是3个连续数字的最大和,这是可行的,因为48是数字0的ascii代码,49是数字1的ascii代码,因此您的代码应该是这样的:
#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;
}
}
}发布于 2013-12-03 02:02:25
你有这么多嵌套的条件句,我想你可能把自己搞糊涂了。我相信创建一个整数数组会更容易,并且在数组的每个索引处初始化为零。然后将索引指示的数字加1(第一个数字到第0个索引,第二个数字到第一个索引,等等)到该索引和前面的两个索引(如果它们存在,您必须进行边界检查)。然后只需找到并打印数组中最大的数字。
发布于 2013-12-03 07:16:38
@T-D很好地涵盖了主要问题:使用a = i - '0'而不是a = i。(在4个地方)
@Jonah Nelson确实指出嵌套有点过了。下面是一个简化的版本。
操作码在处理既不是空格也不是数字的文本时确实有问题。
#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;
}https://stackoverflow.com/questions/20334746
复制相似问题