信息学奥赛一本通(C++版) 第一部分 C++语言 第四章 循环结构的程序设计

信息学奥赛一本通(C++版) 第一部分 C++语言 第四章 循环结构的程序设计

http://ybt.ssoier.cn:8088

第一节 for语句

//1059 求平均年龄
#include <stdio.h>
int main(){
    int n,a,i,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        sum+=a;
    }
    printf("%.2lf",sum*1.0/n);
    return 0;
}

//1060 均值
#include <stdio.h>
int main(){
    int n,i;
    double a,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%lf",&a);
        sum+=a;
    }
    printf("%.4lf",sum/n);
    return 0;
}

//1061 求整数的和与均值
#include <stdio.h>
int main(){
    int n,a,i,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        sum+=a;
    }
    printf("%d %.5lf",sum,sum*1.0/n);
    return 0;
}

//1062 最高的分数
#include <stdio.h>
int main(){
    int n,i,a,max=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(a>max)max=a;
    }
    printf("%d",max);
    return 0;
}

//1063 最大跨度值
#include <stdio.h>
int main(){
    int max=0,min=9999,n,a,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(a>max)max=a;
        if(a<min)min=a;
    }
    printf("%d",max-min);
    return 0;
}

//1064 奥运奖牌计数
#include <stdio.h>
int main(){
    int n,x,y,z,i,sum1=0,sum2=0,sum3=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%d%d",&x,&y,&z);
        sum1+=x,sum2+=y,sum3+=z;
    }
    printf("%d %d %d %d\n",sum1,sum2,sum3,sum1+sum2+sum3);
    return 0;
}

//1065 奇数求和
#include <stdio.h>
int main(){
    int m,n,i,sum=0;
    scanf("%d%d",&m,&n);
    for(i=m;i<=n;i++){
        if(i%2==1)sum+=i;
    }
    printf("%d",sum);
    return 0;
}

//1066 满足条件的数累加
#include <stdio.h>
int main(){
    int m,n,i,sum=0;
    scanf("%d%d",&m,&n);
    for(i=m;i<=n;i++)
        if(i%17==0)
            sum+=i;
    printf("%d",sum);
    return 0;
}

//1067 整数的个数
#include <stdio.h>
int main(){
    int n,i,a,cnt1=0,cnt2=0,cnt3=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(a==1)cnt1++;
        else if(a==5)cnt2++;
        else if(a==10)cnt3++;
    }
    printf("%d\n%d\n%d",cnt1,cnt2,cnt3);
    return 0;
}

//1068 与指定数字相同的数的个数
#include <stdio.h>
int main(){
    int n,m,a,i,cnt=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(a==m)cnt++;
    }
    printf("%d",cnt);
    return 0;
}

//1069 乘方计算
#include <stdio.h>
int main(){
    int a,n,i,ans=1;
    scanf("%d%d",&a,&n);
    for(i=1;i<=n;i++)
        ans*=a;
    printf("%d",ans);
    return 0;
}

//1070 人口增长
#include <stdio.h>
int main(){
    int x,n,i;
    double ans;
    scanf("%d%d",&x,&n);
    ans=x;
    for(i=1;i<=n;i++)
        ans*=(1+0.001);
    printf("%.4lf",ans);
    return 0;
}

//1071 菲波那契数
//提交未通过,明白了,k=1,k=2的情况没考虑,修改,提交AC
#include <stdio.h>
int main(){
    int k,f1=1,f2=1,f3=1,i;// f3
    scanf("%d",&k);
    for(i=3;i<=k;i++){
        f3=f1+f2;
        f1=f2,f2=f3;
    }
    printf("%d",f3);
    return 0;
}


//1072 鸡尾酒疗法
//提交,未通过,猜测,还是浮点运算出了问题,
//浮点比较运算时,一定要小心再小心。修改,提交AC,代码中,注释部分代码,提交未通过。
//浮点比较运算要当心。
#include <stdio.h>
int main(){
    int n,a,b,i;
    double ans1,ans2;
    scanf("%d",&n);
    scanf("%d%d",&a,&b);
    ans1=b*1.0/a;//ans1=b*1.0/a*100;
    for(i=2;i<=n;i++){
        scanf("%d%d",&a,&b);
        ans2=b*1.0/a;// ans2=b*1.0/a*100;
        if(ans1-ans2>0.05)printf("worse\n");//if(ans1-ans2>5)
        else if(ans2-ans1>0.05)printf("better\n");//else if(ans2-ans1>5)
        else printf("same\n");
    }
    return 0;
}

//1073 救援
#include <stdio.h>
#include <math.h>
int main(){
    int n,m,i;
    double x,y,t=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%lf%lf%d",&x,&y,&m);
        t+=sqrt(x*x+y*y)*2/50+m*1.5;
    }
    if(t>(int)t)printf("%d",(int)t+1);
    else printf("%d",(int)t);
    return 0;
}


//1074 津津的储蓄计划
//http://ybt.ssoier.cn:8088/problem_show.php?pid=1074
//会模拟,才会编程,将样例1,样例2 模拟了一遍,可以开始编程
//样例通过,提交AC 2018-4-20
#include <stdio.h>
int main(){
    int a,i,sheng=0,cun=0;//a读入消费,sheng剩下的钱,cun存在妈妈那的钱
    for(i=1;i<=12;i++){
        scanf("%d",&a);
        sheng+=300-a;
        if(sheng<0){
            printf("%d",-i);
            return 0;
        }
        cun+=sheng/100*100;
        sheng%=100;
    }
    printf("%d",sheng+cun/10*12);//请注意cun一定是100的整数倍,所以不必担心cun/10*12这个运算,求出的数据一定是精准的。
    return 0;
}

//1074 津津的储蓄计划
#include <stdio.h>
int main(){
    int i,sheng=0,cun=0,a;
    for(i=1;i<=12;i++){
        scanf("%d",&a);
        sheng+=300-a;
        if(sheng<0){
            printf("%d",-i);
            return 0;
        }
        cun+=sheng/100*100;
        sheng%=100;
    }
    printf("%d",sheng+cun*12/10);
    return 0;
}

//1075 药房管理
//提交,未通过,修改,提交AC
#include <stdio.h>
int main(){
    int m,n,i,a,cnt=0;
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(m>=a){//此处写成 if(m>a)
            m-=a;
            cnt++;
        }
    }
    printf("%d",n-cnt);
    return 0;
}

//1076 正常血压
//一开始觉得题目有歧义,第一次测量算几小时,仔细研究样例,发现,第一次测量正常算1小时
#include <stdio.h>
int main(){
    int n,a,b,i,cnt=0,max=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%d",&a,&b);
        if(90<=a&&a<=140&&60<=b&&b<=90){
            cnt++;
            if(cnt>max)max=cnt;
        }else
            cnt=0;
    }
    printf("%d",max);
    return 0;
}

//1077 统计满足条件的4位数
#include <stdio.h>
int main(){
    int n,i,a,b,c,d,e,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&e);
        a=e/1000;
        b=e%1000/100;
        c=e%1000%100/10;
        d=e%10;
        if(d>a+b+c)cnt++;
    }
    printf("%d",cnt);
    return 0;
}

//1078 求分数序列和
#include <stdio.h>
int main(){
    int n,p,q,i,t;
    double ans=0;
    scanf("%d",&n);
    p=1,q=2;
    for(i=1;i<=n;i++){
        ans+=q*1.0/p;
        t=p;
        p=q;
        q+=t;
    }
    printf("%.4lf",ans);
    return 0;
}

//1079 计算分数加减表达式的值
#include <stdio.h>
int main(){
    int n,i;
    double ans=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        if(i%2==1)ans+=1.0/i;
        else ans+=-1.0/i;
    printf("%.4lf",ans);
    return 0;
}

//1080 余数相同问题
#include <stdio.h>
int main(){
    int a,b,c,min=0,i;
    scanf("%d%d%d",&a,&b,&c);
    min=a>b?b:a;
    min=min>c?c:min;//找最小值
    for(i=2;i<=min;i++)
        if(a%i==b%i&&b%i==c%i){
            printf("%d",i);
            break;
        }
    return 0;
}

//1081 分苹果
//小朋友拿到的苹果是连续自然数1,2,3,4,5,......
//高斯算法
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    printf("%d",n*(n+1)/2);
    return 0;
}

//1082 求小数的某一位

//可先在纸上进行除法运算,找规律,第一次的余数扩大10倍是第二次的被除数

//第二次的余数扩大10倍是第三次的被除数

//第n-1次的余数扩大10倍是第n次的被除数     2018-4-22 8:30

//样例通过,提交AC 2018-4-20
//提供几组测试样例
1 100 1
0
1 100 2
1
1 100 3
0
1 100 4
0
1 100 5
0
#include <stdio.h>
int main(){
    int a,b,n,i;//商 余数
    scanf("%d%d%d",&a,&b,&n);
    for(i=1;i<=n-1;i++){
        a*=10;
        a%=b;
    }
    printf("%d",a*10/b);
    return 0;
}


//1082 求小数的某一位
//题目真好,已经让a<b,省去了处理这步
//该题,首先要进行纸上模拟除法运算,之后再编码才能得心应手。
#include <stdio.h>
int main(){
    int a,b,n,i,shang;
    scanf("%d%d%d",&a,&b,&n);
    for(i=1;i<=n;i++){
        a*=10;
        shang=a/b;
        a%=b;
    }
    printf("%d",shang);
    return 0;
}

//1083 计算星期几
#include <stdio.h>
int main(){
    int a,b,i,ans=1;
    scanf("%d%d",&a,&b);
    for(i=1;i<=b;i++)
        ans=(ans*a)%7;
    switch(ans){
        case 0:
            printf("Sunday");
            break;
        case 1:
            printf("Monday");
            break;
        case 2:
            printf("Tuesday");
            break;
        case 3:
            printf("Wednesday");
            break;
        case 4:
            printf("Thursday");
            break;
        case 5:
            printf("Friday");
            break;
        case 6:
            printf("Saturday");
            break;
    }
    return 0;
}

//1084 幂的末尾
//提交,未通过,重新读题,发现这句“若幂本身不足三位,在前面补零。”
//修改,提交AC
#include <stdio.h>
int main(){
    int a,b,i,ans=1;
    scanf("%d%d",&a,&b);
    for(i=1;i<=b;i++)
        ans=(ans*a)%1000;
    if(ans>=100)printf("%d",ans);
    else if(10<=ans&&ans<100)printf("0%d",ans);
    else printf("00%d",ans);
    return 0;
}

2017-10-22 9:31 AC该节内容


第二节 while语句

//1085 球弹跳高度的计算
//画图理解,进行编码,效率会比较高。
//样例数据有误:
//正确如下
//输入:
//20
//输出:
//59.9219
//0.0195313
#include <stdio.h>
int main(){
    int h,i;
    double sum=0,a;
    scanf("%d",&h);
    sum=h,a=1.0*h/2;
    for(i=2;i<=10;i++){
        sum+=a*2;
        a/=2;
    }
    printf("%g\n%g",sum,a);
    return 0;
}

//1086 角谷猜想
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    while(n!=1){
        if(n%2==1){
            printf("%d*3+1=%d\n",n,n*3+1);
            n=n*3+1;
        }else{
            printf("%d/2=%d\n",n,n/2);
            n/=2;
        }
    }
    printf("End");
    return 0;
}

//1087 级数求和
#include <stdio.h>
int main(){
    int k,n=0;
    double sn=0;
    scanf("%d",&k);
    while(sn<=k){
        n++;
        sn+=1.0/n;
    }
    printf("%d",n);
    return 0;
}

//1088 分离整数的各个数
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    while(n){
        printf("%d ",n%10);
        n/=10;
    }
    return 0;
}

//1089 数字反转
//0需要单独处理
#include <stdio.h>
int main(){
    int a;
    scanf("%d",&a);
    if(a==0){
        printf("0");
        return 0;
    }
    if(a<0){
        printf("-");
        a=-a;
    }
    while(a%10==0)a/=10;
    while(a){
        printf("%d",a%10);
        a/=10;
    }
    return 0;
}

//1090 含k个3的数
#include <stdio.h>
int main(){
    int m,k,a,cnt=0;
    scanf("%d%d",&m,&k);
    a=m;
    while(a){
        if(a%10==3)cnt++;
        a/=10;
    }
    if(cnt==k&&m%19==0)printf("YES");
    else printf("NO");
    return 0;
}

2017-10-22 12:13 AC该节内容

第三节 do-while语句


2017-10-22 12:13 AC该节内容

第四节 循环嵌套

//1091 求阶乘的和
#include <stdio.h>
int f(int n){
    int i,ans=1;
    for(i=1;i<=n;i++)
        ans*=i;
    return ans;
}
int main(){
    int n,i,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        sum+=f(i);
    printf("%d",sum);
    return 0;
}

//1092 求出e的值
#include <stdio.h>
long long f(int n){
    int i;
    long long ans=1;
    for(i=1;i<=n;i++)
        ans*=i;
    return ans;
}
int main(){
    int n,i;
    double e=0;
    scanf("%d",&n);
    for(i=0;i<=n;i++)
        e+=1.0/f(i);
    printf("%.10lf",e);
    return 0;
}

//1093 计算多项式的值
//该题要小心,n<=10^6,一不小心,要超时 ,一开始很轻松编出代码,但测试中发现超时
//马上进行修改,提交 未通过,将float全改成double ,提交AC,上了题目的当,题中说
//"保证最终结果在float范围内",瞎扯,记住了用double不会错。
#include <stdio.h>
int main(){
    int i,n;
    double x,ans=1,t=1;
    scanf("%lf%d",&x,&n);
    for(i=1;i<=n;i++){
        t*=x;
        ans+=t;
    }
    printf("%.2lf",ans);
    return 0;
}

//1094 与7无关的数
#include <stdio.h>
int f(int n){
    if(n%7==0)return 1;
    while(n){
        if(n%10==7)return 1;
        n/=10;
    }
    return 0;
}
int main(){
    int n,i,ans=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        if(f(i)==0)
            ans+=i*i;
    printf("%d",ans);
    return 0;
}

//1095 数1的个数
#include <stdio.h>
int f(int n){
    int cnt=0,i;
    while(n){
        if(n%10==1)cnt++;
        n/=10;
    }
    return cnt;
}
int main(){
    int i,cnt=0,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        cnt+=f(i);
    printf("%d",cnt);
    return 0;
}

//1096 数字统计
#include <stdio.h>
int f(int n){
    int i,cnt=0;
    while(n){
        if(n%10==2)cnt++;
        n/=10;
    }
    return cnt;
}
int main(){
    int left,right,i,ans=0,cnt=0;
    scanf("%d%d",&left,&right);
    for(i=left;i<=right;i++){
        cnt+=f(i);
    }
    printf("%d",cnt);
    return 0;
}

//1097 画矩形
//提交,未通过,一测试,发现是自己编码的问题,修改,提交AC
#include <stdio.h>
int main(){
    int row,col,i,j,cmd;
    char s[2];
    scanf("%d%d%s%d",&row,&col,s,&cmd);
    if(cmd==1)
        for(i=1;i<=row;i++){
            for(j=1;j<=col;j++){
                printf("%c",s[0]);
            }
            printf("\n");
        }
    else{
        for(j=1;j<=col;j++)
            printf("%c",s[0]);
        printf("\n");
        for(i=2;i<=row-1;i++){
            for(j=1;j<=col;j++)
                if(j==1||j==col)
                    printf("%c",s[0]);
                else
                    printf(" ");
            printf("\n");
        }
        for(j=1;j<=col;j++)
            printf("%c",s[0]);
        printf("\n");
    }
    return 0;
}

//1098 质因数分解
#include <stdio.h>
int main(){
    int n,i;
    scanf("%d",&n);
    for(i=2;i*i<=n;i++)
        if(n%i==0){
            printf("%d",n/i);
            break;
        }
    return 0;
}

//1099 第n小的质数
//样例解释2 3 5 7 11 13 17 19 23 29   
#include <stdio.h>
int isPrime(int n){
    int i;
    if(n<2)return 0;
    if(n==2)return 1;
    for(i=2;i*i<=n;i++)
        if(n%i==0)return 0;
    return 1;
}
int main(){
    int n,k=2,cnt=1;
    scanf("%d",&n);
    while(cnt<n){
        k++;
        while(isPrime(k)==0)k++;
        cnt++;
    }
    printf("%d",k);
    return 0;
}

//1100 金币
#include <stdio.h>
int main(){
    int n,ans=0,i,d=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        d+=i;
        ans+=i*i;
        if(d>=n)
            break;
    }
    if(d==n)printf("%d",ans);
    else printf("%d",ans-(d-n)*i);
    return 0;
}

//1101 不定方程求解
//思路 枚举
#include <stdio.h>
int main(){
    int a,b,c,cnt=0,i,j;
    scanf("%d%d%d",&a,&b,&c);
    for(i=0;i<=c;i++)
        for(j=0;j<=c;j++)
            if(a*i+b*j==c)cnt++;
            else if(a*i+b*j>c)break;
    printf("%d",cnt);
    return 0;
}

2017-10-22 14:05 AC该节内容

2017-10-22 14:05 AC该章节内容

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/78300517
今日推荐