我正在尝试以字符串形式读取数字列表,并计算应该有多少个包。每个包最多有50个。例如,"25 25 25 -1"
的输出应该是2,但我得到的是1。
你能检查一下我的代码吗?
int main(void) {
int input = 0;
int diff = 50;
int output = 0;
printf("Input: n");
do {
scanf("%d", &input);
if (input < diff) {
diff -= input;
} else if (diff == input) {
diff = 50;
output++;
} else {
diff = 50 - input;
output++;
}
} while (input != -1);
printf("Output: %d", output);
return 0;
}
正如我在评论中提到的,您在循环的开始读取input
一次,并在循环的结束将其与-1
进行比较,因此-1
将与其他input
值一样得到处理。
显而易见的选择是在两个不同的地方读取,一个在循环之前,一个是在循环结束时,这样您将直接在循环条件之前获得一个新的input
值:
printf("Input: n");
scanf("%d", &input);
while(input != -1) {
// Processing
scanf("%d", &input);
}
请注意,我还将循环切换到了while
循环,而不是do ... while
循环,就好像提供的输入only包含-1
,那么do ... while
仍然会处理它,从而导致错误的输出。
您也没有考虑到在循环结束时包可能不完整,这可以通过检查循环后是否有未计数的包来解决:
printf("Input: n");
scanf("%d", &input);
while(input != -1) {
// Processing
scanf("%d", &input);
}
if(diff != 50) {
output++;
}
请确保不要将"-1"用作已处理数据的一部分。
还要看看你的算法。
也许是这样的:
#include <stdio.h>
int main(void) {
int input = 0;
int load = 50;
int output = 0;
printf("Input: n");
while (1) {
if (scanf("%d", &input) != 1 || input > 50)
{
// Illegal input
exit(1);
}
if (input == - 1)
{
// Done
break;
}
if (load + input > 50)
{
++output; // Take new package
load = 0; // make it empty
}
load += input; // Put into package
};
printf("Output: %d", output);
return 0;
}