【发布时间】:2020-04-07 10:53:57
【问题描述】:
不幸的是......我昨天问了这个关于另一个错误的问题,希望我不再有这些错误,但我仍然有这个尴尬的输出,比如某种取决于数组元素的数字,如 -4221565 或-4647963 等...直到现在我认为我的数组附加部分工作正常,我试过了。但我猜想条件中的 -1 有问题,但我不能说出它的名字。 For循环也是我想说的另一个地方。我从凌晨 3 点开始尝试解决这个问题,然后拖延,然后尝试...截止日期是 7.04.2020(今天)22.00,所以我开始发疯了。任何帮助将不胜感激。谢谢。所以这是个问题(输入不必是 15,最多可以是 15):
您必须将最多 15 种不同的货物从一个港口运送到另一个港口。运输这些货物的货船的承载能力为 50 吨。枚举负载,并提供有关每个负载重量的信息作为输入。
假设每件货物的重量小于等于50吨且大于0。
您将在一行中从输入中读取每个负载的重量。您的输入将以 -1 结尾。您将打印必要的旅行次数。
示例输入:
50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1
输出:15
输入: 20 25 25 36 37 25 20 10 50 9 16 45 32 10 25 -1
输出: 11
输入: 14 16 50 10 10 19 45 40 32 24 25 47 10 12 25 -1
输出: 9
输入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -1
输出: 3
这是我的代码:
#include <stdio.h>
int main()
{ int w,i,sum,index;
int list[15];
w = 1;
index = 0;
do
{ scanf("%d",&w);
list[index] = w;
index++;
}while(w != -1);
sum = 0;
for(i = 0;i < 15;i++)
{
sum +=list[i];
}
sum = sum / 50;
printf("%d",sum);
return 0;
}
【问题讨论】:
-
您的循环将
-1存储在 15 元素数组的不存在的第 16 个元素中,这样做会调用 未定义的行为。将你的循环改为一个while循环,特别是while (index < 15 && scan("%d", &w) == 1 && w != -1) { list[index++] = w; } -
将 do-while 更改为
while(1) { scanf("%d", &w); if(w==-1) break; list[index] = w; index++} -
在循环遍历和求和值时输入的整数少于 15 个的情况下,您仍在对数组中未设置为值的值求和。您正在对未定义的值求和,这就是您得到奇怪负数的原因之一。你应该只在求和循环中循环比索引少一。
-
而且,相关的,你不需要一个数组,你可以很容易地将
sum += w;放入循环中,而不是存储在一个数组中,碰到一个计数器并将其用作你的稍后的元素计数(无论如何你似乎都没有使用它,这本身就是一个缺陷)。 -
任务也没有很好的制定。它并没有说你可以按照你想要的任何顺序选择它们,但它也没有禁止它。如果允许以任意顺序选择它们,则第二种情况可能有 7 次行程。
标签: c arrays for-loop logic knapsack-problem