问题如下:
#include
int main()
{
int n = 0, a[10000] = { 0 }, i = 0, j = 0, k = 0, sum = 0;
scanf("%d", &n);
if(n>=-10000&&n<=10000)
{
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
k = a[0];
for (i = 0; i < n; i++)
{
if (k <= a[i + 1])
{
k = a[i + 1];
}
}
j = a[0];
for (i = 0; i < n; i++)
{
if (j >= a[i + 1])
{
j = a[i + 1];
}
}
for (i = 0; i < n; i++)
{
sum += a[i];
}
printf("%d\n%d\n%d", k, j, sum);
}
return 0;
}
想问一下我的答案为什么只有八十分呀,vs调试没有问题呀
计算最大值和最小值那里都有点错误,因为a[i+1]会导致数组越界,有两种解决办法:
1、把两个if里面的a[i+1]都改为a[i],即比较数组里的每个数,然后计算出最大值与最小值;
2、把判断判断最大值最小值那两个for循环里的n都改为n-1,即保证数组不越界,同时又还可以保持使用a[i+1]的方式来寻找最大值最小值。
下面的例子采用第一种办法,修改如下:
#include<stdio.h>
int main()
{
int n = 0, a[10000] = { 0 }, i = 0, j = 0, k = 0, sum = 0;
scanf("%d", &n);
if(n>=-10000&&n<=10000)
{
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
k = a[0];
for (i = 0; i < n; i++)
{
if (k <= a[i ])
{
k = a[i ];
}
}
j = a[0];
for (i = 0; i < n; i++)
{
if (j >= a[i ])
{
j = a[i];
}
}
for (i = 0; i < n; i++)
{
sum += a[i];
}
printf("%d\n%d\n%d", k, j, sum);
}
return 0;
}
#include <stdio.h>
int main()
{
int n = 0, a[10000] = { 0 }, i = 0, j = 0, k = 0;
long long sum = 0; // 这里改成long long,最多有10000个数,用int可能会溢出
scanf("%d", &n);
// 这里没必要加判断,题目给数据总不会给错吧,当然,这个不影响结果
// if (n >= -10000 && n <= 10000)
// {
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
k = a[0];
for (i = 0; i < n; i++)
{
if (k <= a[i + 1])
{
k = a[i + 1];
}
}
j = a[0];
for (i = 0; i < n - 1; i++) // 这里要注意,i要< n - 1因为如果是i < n的话当i=n-1时,就会和a[i+1]比较,也就是a[n],这个值其实是0,所以这样子最小值不准确。
{
if (j >= a[i + 1])
{
j = a[i + 1];
}
}
for (i = 0; i < n; i++)
{
sum += a[i];
}
printf("%d\n%d\n%d", k, j, sum);
// }
return 0;
}
在计算最小值时有错误,
应该是在遍历整个数组时再与当前最小值进行比较,而不是与下一个数字进行比较
for (i = 0; i < n; i++)
{
if (j > a[i])
{
j = a[i];
}
}