[不幸的是...昨天我问了关于另一个错误的确切问题,希望我不再有那些错误,但是我仍然有这个笨拙的输出,就像某种数字一样,取决于-4221565或- 4647963等...直到现在,我认为我的数组附加部分正常工作,我尝试过。但是我猜想条件中的-1出了点问题,但我无法命名。 For loop也是另一个我想说的地方。我正在尝试从凌晨3.00开始解决这个问题,然后拖延它,然后再尝试...截止日期为7.04.2020(TODAY)22.00,所以我开始变得疯狂。任何帮助将不胜感激。谢谢。所以这是一个问题(İnputs不必为15,最多可以为15):
您最多只能将15个不同的负载从一个端口运输到另一个端口。运送这些货物的货船的承载能力为50吨。枚举载荷,有关每个载荷重量的信息作为输入。
假设每个负载的重量小于或等于50吨且大于0。
您将在一行中从输入中读取每个负载的重量。您的输入将以-1结尾。您将打印必要的旅行次数。
样本输入:
50 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
的边界将是数组的第16个错误的元素。您至少需要int list[16];
。但是我想说您的解决方案是错误的,您要根据给定的输入和输出判断负载以将其放置在货船中。例如,如果一艘船上有30个和10个,您可以将20个负载划分为两个10个负载,以便在船上放置最多50吨的货物。
您需要的是:
0
吨的船50
时向其添加负载50
counter_ship++
,然后将该负载添加到新负载中。int main(void) {
int w;
int sum = 0;
int ship_counter = 0;
scanf("%d", &w);
while (w != -1) {
if (sum + w > 50)
{
ship_counter++;
sum = 0;
}
sum += w;
scanf("%d", &w);
}
if (sum != 50)
ship_counter++;
printf("%d", ship_counter);
return 0;
}
while(w != -1 && index < 15)
{ scanf("%d",&w);
list[index] = w;
index++;
}
这样可以避免写超出数组边界。然后,for循环的条件可能是:
for(i = 0;i < index; i++)
(索引值来自上一个循环,仅取决于最后插入的下一个项目)。因此,您正在汇总实际具有输入的项目,而不是整个数组。
当然,如其他人所述,您可以不使用数组。
希望有所帮助
#include <stdio.h>
#define max_loads 5
int main()
{
int w[max_loads];
int cap;
int trips;
int i;
int sum = 0;
printf("Enter the weights of %d loads:\n",max_loads);
for(int i = 0; i < max_loads; i++)
{
scanf("%d",&w[i]);
sum = sum + w[i];
printf(" ");
}
printf("\n");
i = 0;
do
{ sum = sum - w[i];
trips++;
i++;
} while (sum > 0);
printf("The amount of needed trips are: %d", trips);
return 0;
}
do { scanf("%d",&w); list[index] = w; index++; } while(w != -1);
在最后一次迭代中,当您输入-1
时,代码会将-1
存储在list
的第16个不存在的数组元素中-它写入超出数组界限的位置,这会调用未定义的行为。您可以使用
if
语句在分配发生之前检查-1
的值,然后如果break
匹配则跳出循环。这样,您可以将do while(...)
循环更改为while(1)
循环。您也可以省略第二个循环
for(i = 0;i < 15;i++) { sum +=list[i]; }
并在第一个中包含sum = sum + w;
。这样,您甚至可以省略定义数组。结果是:
while(1) { scanf("%d",&w); if(w == -1) break; sum = sum + w; };
整个代码:
#include <stdio.h> int main() { int w,i,sum,index; w = 1; while(1) { scanf("%d",&w); if(w == -1) break; sum = sum + w; }; sum = sum / 50; printf("%d",sum); return 0; }
#include <stdio.h>
void swap(int* xp, int* yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
// Function to perform Selection Sort
void selectionSort(int arr[], int n)
{
int i, j, min_idx;
// One by one move boundary of unsorted subarray
for (i = 0; i < n - 2; i++) {
// Find the minimum element in unsorted array
min_idx = i;
for (j = i + 1; j < n-1; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
// Swap the found minimum element
// with the first element
swap(&arr[min_idx], &arr[i]);
}
}
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);
selectionSort(list,index);
for (int i = 0; i < index; i++)
printf("%d ", list[i]);
printf("\n");
int ans=0;
int threshold=0;
for(int i=0; i<index; ++i){
if(threshold + list[i]<=50){
threshold+=list[i];
}
else {
threshold = list[i];
++ans;
}
}
ans++;
printf("%d", ans);
return 0;
}