累加是指在一个值的基础上重复加上其他值,典型的应用由:求和、计数(统计出现的次数等)。累加法一般由循环结构来实现,在设计循环算法时,需要确定以下三个方面的内容:
- 循环控制变量的初值、终值和步长;
- 循环体的内容(一般包括语句:S=S+T)
- 循环的结束条件(一般与T有关)
1、求e的值,根据输入的n值,求前n项之和。e=1 + 1/1! + 1/2! + 1/3! + … + 1/n!。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
double t,sum = 1.0; //t为阶乘,即为前一项阶乘再乘上这一项,sum记录阶乘和
printf("请输入一个正整数:");
scanf("%d",&n);
for(i = 1,t = 1;i <= n;t *= (1.0/++i))
sum += t;
printf("e=%f\n",sum);
return 0;
}
2、在唱歌等大奖赛评分时,一般要有若干名评委,记分规则是:去掉一个最高分和一个最低分,再算平均分。设按百分制计分,请设计一个算分的程序(提示:算法的基本思路:
- 输入评委人数N;
- 一一输入每个评委的打分,同时累加求和sum,并记录下最高分max和最低分min)
int main()
{
int N,i;
printf("请输入评委人数:");
scanf("%d",&N);
float a[N],score,mean,min = 100.0,max = 0.0,sum = 0.0;
for(i=0;i<N;i++){
score = -1;
while(score<0||score>100){
printf("请输入分数(0~100):");
scanf("%f",&score);
}
a[i] = score;
}
for(i=0;i<N;i++){
if(a[i]<min){
min = a[i];
}
if(a[i]>max){
max = a[i];
}
sum += a[i];
}
mean = ((sum-max-min)/(N-2));
printf("最高分为:%.1f\n",max);
printf("最低分为:%.1f\n",min);
printf("平均分为:%.1f\n",mean);
return 0;
}
3、生日问题:假设班里人数N=35,又生日在一年的365天等概率分布。问至少两人同一天生日的概率多大?
算法思路:使用选票统计算法。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int M,i,j,k,a[35],res,flag,num;
float simulation,theory,sum = 0.0,t,n;
printf("请输入模拟次数:");
scanf("%d",&M);
srand(time(NULL));
//M代表模拟多少次
for(i = 0;i < M;i++){
flag = 0;
num = 1;
for(j = 0;j < 35;j++){
a[j] = rand()%365;
}
for(j = 0;j < 34;j++){
for(k = j+1;k < 35;k++){
if(a[j] == a[k]){
num++;
}
}
if(num>1){
flag = 1;
printf("在第%d次模拟中,第%d天出生的有%d人\n",i,a[j],num);
break;
}
}
for(j = 0;j < 35;j++){
printf("%5d",a[j]);
}
printf("\n——");
printf("\n");
if(flag == 1)
sum++;
}
simulation = (sum/M);
t = 365;
n = t/365;
for(i = 1;i <35;i++){
t--;
n *= t/365;
}
theory = 1-n;
printf("simulation:%.3f%%\n",(simulation*100));
printf("theory:%.3f%%\n",(theory*100));
return 0;
}