算法回顾(累加法)

累加是指在一个值的基础上重复加上其他值,典型的应用由:求和、计数(统计出现的次数等)。累加法一般由循环结构来实现,在设计循环算法时,需要确定以下三个方面的内容:

  1. 循环控制变量的初值、终值和步长;
  2. 循环体的内容(一般包括语句:S=S+T)
  3. 循环的结束条件(一般与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、在唱歌等大奖赛评分时,一般要有若干名评委,记分规则是:去掉一个最高分和一个最低分,再算平均分。设按百分制计分,请设计一个算分的程序(提示:算法的基本思路:

  1. 输入评委人数N;
  2. 一一输入每个评委的打分,同时累加求和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;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值