信息学奥赛一本通 第四章 循环结构的程序设计第一节C语言非C++

第四章 循环结构的程序设计

第一节 for语句

2016:【例4.1】for循环求和

#include<bits/stdc++.h> 
using namespace std;
int main()
{
    
    
    int n, sum = 0;
    cin >> n;
    for(int i = 1; i <= n; ++i)
        sum += i;
    cout << sum;
    return 0;
}


2017:【例4.2】输出偶数

#include<stdio.h>

int main()
{
    
    
    int n; //定义整型变量n
    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,从1遍历到n
    for(int i = 1; i <= n; ++i)
    {
    
    
        //如果i是偶数,就输出i和一个空格
        if(i % 2 == 0)
            printf("%d ", i);
    }

    return 0;
}

2018:【例4.3】输出奇偶数之和

#include<stdio.h>

int main()
{
    
    
    int n, sumOdd = 0, sumEven = 0; //定义整型变量n, sumOdd用来保存奇数和, sumEven用来保存偶数和
    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,从1遍历到n
    for(int i = 1; i <= n; ++i)
    {
    
    
        //如果i是奇数,就把i累加到sumOdd上
        if(i % 2 == 1)
            sumOdd += i;
        //否则,把i累加到sumEven上
        else
            sumEven += i;
    }

    //输出偶数和和奇数和
    printf("%d %d\n", sumEven, sumOdd);

    return 0;
}

2019:【例4.4】求阶乘

#include<stdio.h>

int main()
{
    
    
    long long n, res = 1; //定义长整型变量n和res,res用来保存阶乘结果,初始化为1
    scanf("%lld", &n); //从标准输入读取一个长整数n

    //for循环,从1乘到n
    for(int i = 1; i <= n; ++i)
        res *= i; //计算阶乘,每次循环计算i的乘积

    printf("%lld\n", res); //输出阶乘结果

    return 0;
}

1059:求平均年龄

#include<stdio.h>

int main()
{
    
    
    int n, s = 0, a; //定义整型变量n, s用来保存加和,初始化为0,a用来保存输入的数字
    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,进行n次
    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d", &a); //每次循环都从标准输入读取一个整数a
        s += a; //把a累加到s上
    }

    //输出s除以n的结果,也就是平均值,保留两位小数
    printf("%.2f\n", (double)s / n);

    return 0;
}

1060:均值

#include<stdio.h>

int main()
{
    
    
    double s = 0, a; //定义双精度浮点数s和a,s用来保存加和,初始化为0,a用来保存输入的数字
    int n; //定义整型变量n
    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,进行n次
    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%lf", &a); //每次循环都从标准输入读取一个双精度浮点数a
        s += a; //把a累加到s上
    }

    //输出s除以n的结果,也就是平均值,保留四位小数
    printf("%.4f\n", s / n);

    return 0;
}

1061:求整数的和与均值

#include<stdio.h>

int main()
{
    
    
    int n, s = 0, a; //定义整型变量n, s用来保存加和,初始化为0,a用来保存输入的数字
    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,进行n次
    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d", &a); //每次循环都从标准输入读取一个整数a
        s += a; //把a累加到s上
    }

    //输出s和s除以n的结果,也就是和和平均值,保留五位小数
    printf("%d %.5f\n", s, (double)s / n);

    return 0;
}

1062:最高的分数

#include<stdio.h>

int main()
{
    
    
    int n, a, mx = 0; // 定义整型变量n,a和mx。其中,mx用来保存最大值,初始化为0,a用来保存输入的数字

    scanf("%d", &n); // 从标准输入读取一个整数n

    // for循环,进行n次
    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d", &a); // 每次循环都从标准输入读取一个整数a

        if(a > mx) // 如果a大于mx
            mx = a; // 则更新mx为a的值
    }

    printf("%d\n", mx); // 输出最大值mx

    return 0;
}

1063:最大跨度值

#include<stdio.h>
#include<limits.h>

int main()
{
    
    
    int n, a;
    int mn = INT_MAX; //定义整型变量mn用来保存最小值,初值设为最大整数
    int mx = INT_MIN; //定义整型变量mx用来保存最大值,初值设为最小整数

    scanf("%d", &n); //从标准输入读取一个整数n

    //for循环,进行n次
    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d", &a); //每次循环都从标准输入读取一个整数a

        if(a < mn) //如果a小于mn
            mn = a; //则更新mn为a的值
        if(a > mx) //如果a大于mx
            mx = a; //则更新mx为a的值
    }

    //输出最大跨度值,为最大值减最小值
    printf("%d\n", mx - mn);

    return 0;
}

1064:奥运奖牌计数

#include<stdio.h>

int main()
{
    
    
	int n, g, s, b, sum_g = 0, sum_s = 0, sum_b = 0; //定义整型变量n、g、s、b和sum_g、sum_s、sum_b,用来分别表示人数、金牌数、银牌数、铜牌数以及金、银、铜牌的总数

	scanf("%d", &n); //从标准输入读取一个整数n

	for(int i = 0; i < n; ++i) //for循环,进行n次
	{
    
    
		scanf("%d %d %d", &g, &s, &b); //每次循环都从标准输入读取3个整数表示金、银、铜牌数
		sum_g += g; //将读取到的金牌数加到总金牌数上
		sum_s += s; //将读取到的银牌数加到总银牌数上
		sum_b += b; //将读取到的铜牌数加到总铜牌数上
	}

	printf("%d %d %d %d\n", sum_g, sum_s, sum_b, sum_g+sum_s+sum_b); //输出总金牌数、总银牌数、总铜牌数和总牌数

	return 0;
}

1065:奇数求和

#include<stdio.h>

int main()
{
    
    
    int m, n, s = 0; //定义整数变量m、n和s,其中s用来保存奇数之和

    scanf("%d %d", &m, &n); //从标准输入读取整数m和n

    for(int i = m; i <= n; ++i) //从m循环到n(包括m和n)
    {
    
    
        if (i % 2 == 1) //如果i是奇数
            s += i; //s中增加i
    }

    printf("%d\n", s); //输出s,即m到n之间所有奇数的和

    return 0;
}

1066:满足条件的数累加

#include<stdio.h>

int main()
{
    
    
    int m, n, s = 0; //定义整数变量m、n和s,其中s用来保存能被17整除的数的和

    scanf("%d %d", &m, &n); //从标准输入读取整数m和n

    for(int i = m; i <= n; ++i) //从m循环到n(包括m和n)
    {
    
    
        if(i % 17 == 0) //如果i能被17整除
            s += i; //s中增加i
    }

    printf("%d\n", s); //输出s,即m到n之间所有能被17整除的数的和

    return 0;
}

1067:整数的个数

#include<stdio.h>

int main()
{
    
    
    int k, a, s1 = 0, s5 = 0, s10 = 0; //s1,s5,s10分别初始化为0,用以保存1,5,10的个数

    scanf("%d", &k); //从标准输入读取整数k

    for(int i = 0; i < k; ++i) //进行k次循环
    {
    
    
        scanf("%d", &a); //每次循环都从标准输入读取一个整数a

        if(a == 1) //如果a为1
            s1++; //s1增加1
        if(a == 5) //如果a为5
            s5++; //s5增加1
        if(a == 10) //如果a为10
            s10++; //s10增加1
    }

    printf("%d\n", s1); //输出1的个数
    printf("%d\n", s5); //输出5的个数
    printf("%d\n", s10); //输出10的个数

    return 0;
}

1068:与指定数字相同的数的个数

#include<stdio.h>

int main()
{
    
    
    int n, m, a, ct = 0; //定义四个整数n、m、a和ct,其中a用来保存输入的数字,ct用来保存数字的个数,初始化为0

    scanf("%d %d", &n, &m); //从标准输入读取整数n和m

    for(int i = 0; i < n; ++i) //进行n次循环
    {
    
    
        scanf("%d", &a); //每次循环都从标准输入读取一个整数a

        if(a == m) //如果a等于m
            ct++; //ct增加1
    }

    printf("%d\n", ct); //输出等于m的数字的个数

    return 0;
}

1069:乘方计算

#include<stdio.h>

int main()
{
    
    
    int a, n, r = 1; //定义三个整数a、n和r,其中a是底数,n是指数,r是结果,初始化为1

    scanf("%d %d", &a, &n); //从标准输入读取整数a和n

    for(int i = 0; i < n; ++i) //进行n次循环
        r *= a; //每次循环都将r乘以a

    printf("%d\n", r); //输出r,即a的n次幂

    return 0;
}

1070:人口增长

#include<stdio.h>

int main()
{
    
    
    int n;  // 整数n,表示增长的次数
    double x;  // 双精度浮点数x,表示原始值

    scanf("%lf %d", &x, &n);  // 从标准输入读取浮点数x和整数n

    for(int i = 0; i < n; ++i)  // 进行n次循环
    {
    
    
        x *= 1 + 0.001;  // 每次循环都将x乘以1.001,即让x增长0.1%
    }

    printf("%.4lf\n", x);  // 输出x,即经过n次增长0.1%后的值,保留4位小数

    return 0;
}

1071:菲波那契数

#include<stdio.h>

int main()
{
    
    
    int k, n2 = 1, n1 = 1, t; //定义四个整数k、n2、n1和t,其中n2和n1分别表示当前求出的倒数第二项和最后一项,初始值都为1

    scanf("%d", &k); //从标准输入读取整数k

    if(k <= 2) //如果k小于等于2
        printf("%d\n", 1); //直接输出1
    else
    {
    
    
        for(int i = 3; i <= k; ++i) //从3开始循环到k
        {
    
    
            t = n1 + n2; //计算新的一项
            n2 = n1; //更新倒数第二项
            n1 = t; //更新最后一项
        }
        printf("%d\n", n1); //输出当前求出的最后一项
    }

    return 0;
}

1072:鸡尾酒疗法

#include<stdio.h>

int main()
{
    
    
    int n, t, e; //n:疗法总数 t:病例总数 e:疗效有效病例数
    scanf("%d", &n); //从标准输入读取整数n
    scanf("%d %d", &t, &e); //从标准输入读取整数t和e

    double x = (double)e / t, y; //x:鸡尾酒疗法治愈率 y:其它疗法治愈率

    for(int i = 1; i < n; ++i) //输入n-1组数据
    {
    
    
        scanf("%d %d", &t, &e); //输入某疗法的病例总数及疗效有效病例数
        y = (double)e / t; //计算该疗法的治愈率
        if(y - x > 0.05)
            printf("better\n"); //如果该疗法的治愈率比鸡尾酒疗法高0.05以上,输出"better"
        else if(x - y > 0.05)
            printf("worse\n"); //如果该疗法的治愈率比鸡尾酒疗法低0.05以上,输出"worse"
        else
            printf("same\n"); //如果两疗法的治愈率差距在0.05以内,输出"same"
    }

    return 0;
}

1073:救援

#include<stdio.h>
#include<math.h>

int main()
{
    
    
    int n; // n:坐标点的数量
    double x, y, p, time = 0; // x,y:坐标点的横纵坐标 p:在该坐标点停留的时间 time:通过所有坐标点需要的总时间
    scanf("%d", &n); //从标准输入读取整数n

    for(int i = 1; i<=n; ++i)
    {
    
    
        scanf("%lf %lf %lf", &x, &y, &p); //读取坐标点的横纵坐标及在该坐标点停留的时间
        time += sqrt(x*x + y*y) / 50 * 2 + p * 1.5; //计算通过该坐标点需要的时间并累加到总时间
    }

    printf("%d\n", (int)ceil(time)); //输出通过所有坐标点需要的总时间,向上取整

    return 0;
}

1074:津津的储蓄计划

#include<stdio.h>

int main()
{
    
    
    int m = 0, s = 0, b, t;//m:津津手中的钱 s:存的钱, b:某个月的预算
    for(int i = 1; i <= 12; ++i)
    {
    
    
        scanf("%d", &b); //读取某个月的预算
        if(m + 300 >= b)//如果本月能用的钱大于等于预算
        {
    
    
            t = m + 300 - b;//t:预计本月末剩余的钱
            m = t % 100; //存钱后,手中剩余的钱
            s += t - m; //存钱数,为t中包含的整百数,即 t - t % 100
        }
        else//如果本月能用的钱小于预算
        {
    
    
            printf("%d\n", -i); //输出负数表示第几个月不够用
            return 0;
        }
    }
    printf("%.0f\n", s*1.2 + m);//输出一年后的存款+利息+手里的钱,四舍五入到整数
    return 0;
}

1075:药房管理

#include<stdio.h>

int main()
{
    
    
    int m, n, a, f = 0;//m:药品总数 n:人数 a:每个人取药数量 f:没取上药的人数 
    scanf("%d %d", &m, &n); //读取药品总数和人数
    int r = m; //r:剩余的药品数量 

    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d", &a); //读取一个人取药的数量
        if(r < a)//如果剩余的药品少于要取的药的数量 
            f++;//没取上药人数增加
        else
            r -= a;//药品数量减少
    } 

    printf("%d\n", f); //输出没有取上药的人数
    return 0;
}

1076:正常血压

#include<stdio.h>

int main()
{
    
    
    int n, h, l, c = 0, cm = 0;//n:血压数据个数 h:收缩压,l:舒张压 c:血压连续正常的次数  cm:血压连续正常的最大次数
    scanf("%d", &n); //读取血压数据个数

    for(int i = 0; i < n; ++i)
    {
    
    
        scanf("%d %d", &h, &l); //读取一组高低压数据
        if(h >= 90 && h <= 140 && l >= 60 && l <= 90)//判断这一组高低压是否正常
        {
    
    
            c++;//如果满足条件,则正常血压次数计数
            if(c > cm)
                cm = c; //记录最大连续正常血压次数
        }
        else//如果不满足条件,则正常血压次数置为0
            c = 0;
    }

    printf("%d\n", cm); //输出最长连续正常血压次数
    return 0;
}

1077:统计满足条件的4位数

#include<stdio.h>

int main()
{
    
    
    int n, sum = 0, d1, d2, d3, d4; //n:四位数个数 sum:满足条件的四位数个数 d1-d4:四位数各个位置的数字
    scanf("%d", &n); //读取四位数个数

    for(int i = 0; i < n; ++i)
    {
    
    
        int num;
        scanf("%d", &num); //读取一个四位数
        d1 = num % 10; //个位
        d2 = num / 10 % 10; //十位
        d3 = num / 100 % 10; //百位
        d4 = num / 1000; //千位
        if(d1 - d2 - d3 - d4 > 0) //如果个位数字减去其它每一位数字后结果大于0
            sum += 1; //满足条件的四位数个数加1
    }

    printf("%d\n", sum); //输出满足条件的四位数个数
    return 0;
}

1078:求分数序列和

#include<stdio.h>

int main()
{
    
    
    double s = 0, q = 2, p = 1, t; //s:斐波那契数列的和,q:斐波那契数列的当前项,p:斐波那契数列的前一项,t:暂存变量
    int n; //n:需要计算的斐波那契数列的项数
    scanf("%d", &n); //读取需要计算的斐波那契数列的项数

    for(int i = 0; i < n; ++i)
    {
    
    
        s += q / p; //计算斐波那契数列的和
        t = q; //暂存当前项
        q = q + p; //计算下一项
        p = t; //更新前一项
    } 

    printf("%.4f\n", s); //输出斐波那契数列的和,保留四位小数
    return 0;
}

1079:计算分数加减表达式的值

#include<stdio.h>

int main()
{
    
    
    double s = 0; //s:交错级数的和
    int n, sign = 1; //n:需要计算的交错级数的项数, sign:每项的符号,初始为1
    scanf("%d", &n); //读取需要计算的交错级数的项数

    for(int i = 1; i <= n; ++i) //i:分母
    {
    
    
        s += (double)sign * 1 / i; //每一项:符号乘以分数,分数分子是1,分母是i。要先转为浮点型后再参与计算,以得到小数结果。
        sign = -sign; //交错标志位翻转
    }

    printf("%.4f\n", s); //输出交错级数的和,保留四位小数
    return 0;
}

1080:余数相同问题

#include<stdio.h>

int main()
{
    
    
    int x, a, b, c; //x:我们要找的数,a、b、c:输入的三个数
    scanf("%d %d %d", &a, &b, &c); //从标准输入读取a、b、c

    for(x = 2; x <= 1000000; ++x) //在2到1000000之间寻找满足条件的x
    {
    
    
        if(a%x == b%x && b%x == c%x) //如果a、b、c除以x的余数相等
        {
    
    
            printf("%d\n", x); //输出满足条件的x
            break; //找到一个就可以,所以找到后就跳出循环
        }
    }
    return 0;
}

1081:分苹果

#include<stdio.h>

int main()
{
    
    
    int n, s = 0; //n:需要计算的整数的个数, s:整数的和
    scanf("%d", &n); //从标准输入读取需要计算的整数的个数

    for(int i = 1; i <= n; ++i) //从1到n的所有整数
    {
    
    
        s += i; //计算整数的和
    }

    printf("%d\n", s); //输出整数的和
    return 0;
}

1082:求小数的某一位

#include<stdio.h>

int main()
{
    
    
    int a, b, n, d; //a、b:输入的两个整数,n:需要求的小数部分的位数,d:计算得到的第n位的数字
    scanf("%d %d %d", &a, &b, &n); //从标准输入读取a、b、n

    int r = a % b; //r:初始的余数
    for(int i = 1; i <= n; ++i) //执行n次操作
    {
    
    
        r *= 10; //余数乘以10
        d = r / b; //计算商,即第i位的数字
        r %= b; //计算新的余数
    }

    printf("%d\n", d); //输出第n位的数字
    return 0;
}

1083:计算星期几

#include<stdio.h>

int main()
{
    
    
    int a, b, s = 1; //a、b:输入的两个整数,s:计算的结果
    scanf("%d %d", &a, &b); //从标准输入读取a、b

    a %= 7; //使a的值为a % 7
    for(int i = 0; i < b; ++i) //执行b次操作
        s = (s * a) % 7; //计算s的值

    switch(s) //根据s的值输出对应的星期几
    {
    
    
        case 0:
            printf("Sunday\n");
            break;
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
    }
    return 0;
}

1084:幂的末尾

#include<stdio.h>

int main()
{
    
    
    int a, b, s = 1; //a、b:输入的两个整数,s:计算的结果
    scanf("%d %d", &a, &b); //从标准输入读取a、b

    for(int i = 1; i <= b; ++i) //执行b次操作
        s = (s * a) % 1000; //计算s的值

    if(s < 10) //如果s小于10,输出两个前导零
        printf("00");
    else if (s < 100) //如果s小于100,输出一个前导零
        printf("0");
    printf("%d", s); //输出s的值
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44738632/article/details/134974972