ACM 2 分步实现 打基础 再实现
求一个值delta,让选上了这一门课(未选的
成绩是0)的每个学生的成绩+delta,再计算这门课的平均分,这个平均分恰好等于选了这门课的所有的学生的平均成绩以下的程序是对 “ACM 1 分步实现 打基础 再实现”的改进,按照建立基础的的想法可以让ACM1 程序编译执行的速度提高的倍数=课程数。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 //先计算每个学生的平均值,然后,再计算detal,这样可以避免在f_pinju里多次重复地计算每个 学生的平均成绩。
5 void fpin_jun_each(int data[][10], int pinjun[],int student_num,int class_num)
6 {
7 int i,j,class_count_stu,sum;
8 for(j=0;j<student_num;j++)
9 {
10 sum=0;
11 class_count_stu=0;
12 for(i=0;i<class_num;i++)
13 {
14 if(data[j][i]!=0)
15 {
16 sum+=data[j][i];
17 class_count_stu++;
18 }
19 }
20 pinjun[i]=sum/class_count_stu;
21 }
22
23
24 }
25
26 //int count_in=0;
27 //int deta=0;
28
29 // (y1 + y2 + .....y_count_in+(count_in)*detal) / count_in = n1 = sum / count_in
30 // y1 表示本门课程的源成绩,
31 //sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
32 // count_in表示选本门课的学生数
33 // n1表示选了本门课的 所有学生 的 所有的成绩 的平均值。
34 // detal即为所求的本门所需的差值。
35 // => detal=(sum-(y1+y2....y_count_in)) / count_in
36 // => detal= (sum - totalOfClass ) / count_in.
37 int f_pinjun(int data[][10],int student_num,int row,int class_num)
38 {
39 int count_in=0;
40 int i,sum=0,tmp_sum,j,n_stu_class_num,totalOfClass=0;
41 //deta=0;
42
43 for(i=0; i<student_num; i++)
44 {
45 if(data[i][row]!=0)
46 {
47 //tmp_sum=0;
48 n_stu_class_num=0;
49 /* for(j=0;j<class_num;j++)//这个地方的重复的太多(对于第一个课程data[i][row]!=0 时 计算一次,10门复种就计算同一个学生的平均成绩10次,这完全没有必要)。
50 * ,应当是预先保存每一个学生的平均值,然后调用,这样可以避免重复。
51 {
52 if(data[i][j]!=0)
53 {
54 n_stu_class_num++;
55 tmp_sum+=data[i][j];
56 }
57
58 }*/
59
60 totalOfClass+=data[i][row];
61 //tmp_sum/=n_stu_class_num;
62 count_in++;
63 //sum+=tmp_sum;//sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
64 sum+=pinjun[i];
65 }
66 }
67 //deta=totalOfClass/count_in;
68 //return sum/count_in;
69 return (sum-totalOfClass)/count_in;
70 }
71
72 int main()
73 {
74 char class_name[10][15];
75 int student_num,class_num,i,data[20][10],j;
76 //int pinjun[10]= {0,0};
77 int each_pingjun[20];
78 scanf("%d %d",&student_num,&class_num);
79 //printf("%d %d\n",student_num,class_num);
80
81 for(i=0; i<class_num; i++)
82 {
83 scanf("%s",class_name[i]);
84 }
85
86 for(i=0; i<student_num; i++)
87 {
88 for(j=0; j<class_num; j++)
89 scanf("%d",&data[i][j]);
90 }
91
92 fpinjun_each(data,each_pingjun,student_num,class_num);//
93 //print_data(data,student_num,class_num);
94
95 for(i=0; i<class_num; i++)
96 {
97 //pinjun[i]=f_pinjun(data,student_num,i,class_num);
98 //printf("%d ",pinjun[i]);
99 //if(i!=class_num-1)
100 //printf("%s %d\n",class_name[i],pinjun[i]-deta);
101 //printf("%d\n",deta);
102 printf("%s %d\n",class_name[i],f_pinjun(data,student_num,i,class_num));
103 }
104 //printf("%s %d",class_name[i-1],pinjun[i]-deta);
105
106 return 0;
2 #include <stdlib.h>
3
4 //先计算每个学生的平均值,然后,再计算detal,这样可以避免在f_pinju里多次重复地计算每个 学生的平均成绩。
5 void fpin_jun_each(int data[][10], int pinjun[],int student_num,int class_num)
6 {
7 int i,j,class_count_stu,sum;
8 for(j=0;j<student_num;j++)
9 {
10 sum=0;
11 class_count_stu=0;
12 for(i=0;i<class_num;i++)
13 {
14 if(data[j][i]!=0)
15 {
16 sum+=data[j][i];
17 class_count_stu++;
18 }
19 }
20 pinjun[i]=sum/class_count_stu;
21 }
22
23
24 }
25
26 //int count_in=0;
27 //int deta=0;
28
29 // (y1 + y2 + .....y_count_in+(count_in)*detal) / count_in = n1 = sum / count_in
30 // y1 表示本门课程的源成绩,
31 //sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
32 // count_in表示选本门课的学生数
33 // n1表示选了本门课的 所有学生 的 所有的成绩 的平均值。
34 // detal即为所求的本门所需的差值。
35 // => detal=(sum-(y1+y2....y_count_in)) / count_in
36 // => detal= (sum - totalOfClass ) / count_in.
37 int f_pinjun(int data[][10],int student_num,int row,int class_num)
38 {
39 int count_in=0;
40 int i,sum=0,tmp_sum,j,n_stu_class_num,totalOfClass=0;
41 //deta=0;
42
43 for(i=0; i<student_num; i++)
44 {
45 if(data[i][row]!=0)
46 {
47 //tmp_sum=0;
48 n_stu_class_num=0;
49 /* for(j=0;j<class_num;j++)//这个地方的重复的太多(对于第一个课程data[i][row]!=0 时 计算一次,10门复种就计算同一个学生的平均成绩10次,这完全没有必要)。
50 * ,应当是预先保存每一个学生的平均值,然后调用,这样可以避免重复。
51 {
52 if(data[i][j]!=0)
53 {
54 n_stu_class_num++;
55 tmp_sum+=data[i][j];
56 }
57
58 }*/
59
60 totalOfClass+=data[i][row];
61 //tmp_sum/=n_stu_class_num;
62 count_in++;
63 //sum+=tmp_sum;//sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
64 sum+=pinjun[i];
65 }
66 }
67 //deta=totalOfClass/count_in;
68 //return sum/count_in;
69 return (sum-totalOfClass)/count_in;
70 }
71
72 int main()
73 {
74 char class_name[10][15];
75 int student_num,class_num,i,data[20][10],j;
76 //int pinjun[10]= {0,0};
77 int each_pingjun[20];
78 scanf("%d %d",&student_num,&class_num);
79 //printf("%d %d\n",student_num,class_num);
80
81 for(i=0; i<class_num; i++)
82 {
83 scanf("%s",class_name[i]);
84 }
85
86 for(i=0; i<student_num; i++)
87 {
88 for(j=0; j<class_num; j++)
89 scanf("%d",&data[i][j]);
90 }
91
92 fpinjun_each(data,each_pingjun,student_num,class_num);//
93 //print_data(data,student_num,class_num);
94
95 for(i=0; i<class_num; i++)
96 {
97 //pinjun[i]=f_pinjun(data,student_num,i,class_num);
98 //printf("%d ",pinjun[i]);
99 //if(i!=class_num-1)
100 //printf("%s %d\n",class_name[i],pinjun[i]-deta);
101 //printf("%d\n",deta);
102 printf("%s %d\n",class_name[i],f_pinjun(data,student_num,i,class_num));
103 }
104 //printf("%s %d",class_name[i-1],pinjun[i]-deta);
105
106 return 0;
107 }