最终,程序会记录它应该运行的次数,然后下一个数字是每次运行中将有多少个数字,最后它会输入输入数字。它将继续取每个数字后的平均值直到结束,然后打印所有平均值中的最高平均值。
实施例。它运行得很好,就像一个样本
2< ---运行次数
10< ----元素数量
10 -----首次运行元素的开始
8
9
15个
12个
2
3
8
7
11 -----首次运行元素结束
3 -----第二次运行的元素数量
3 ----开始
2
1 ----结束
输出出来了
10.800000
3.000000
但是我需要它能够做到大约500,000到1,000,000个元素,当它只做5000~
时会崩溃我该如何解决这个问题?我不确定哪些部分可能导致问题
#include <stdio.h>
#include <stdlib.h>
double bestAverage(int* array, long int size);
int main(){
long int i,n,j,k;
double best;
//number of cases
scanf("%ld",&n);
//process each case
for(i=0;i<n;i++){
//number of games played
scanf("%ld",&k);
//allocate memory
int* scores = malloc(sizeof(long int)*k);
for(j=0;j<k;j++){
//score for each game played
scanf("%d", &scores[j]);
}
best = bestAverage(scores,k);
printf("%.6f\n",best);
free(scores);
}
return 0;
}
double bestAverage(int* array, long int size){
long int i;
long double average,sum = 0.0,highest = 0.0;
//allocate memory
double* averages = malloc(sizeof(long int)*size);
for(i=0.0;i<size;i++){
//total scores played so far
sum = sum + array[i];
average = sum/(i+1.0);
//store each average
averages[i] = average;
//find the highest average of all the averages
if(averages[i] > highest){
highest = averages[i];
}
free(averages);
}
return highest;
}
答案 0 :(得分:2)
在bestAverage()
中,在第一次迭代中释放了数组averages
。在以后的迭代中,您正在访问释放的内存。
您应该稍后移动free(averages)
一行。
此外,正如@BLUEPIXY所述,您为scores
和averages
分配了错误的尺寸。