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

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

第二节 while语句

2020:【例4.5】第几项

#include<stdio.h>

int main()
{
    
    
    int m, i = 0, sum = 0; //m:输入的整数,i:当前的数,sum:1+2+...+i的和
    scanf("%d", &m); //从标准输入读取m

    while(sum <= m) //当sum小于等于m时
    {
    
    
        i++; //i自增1
        sum += i; //计算新的sum
    }

    printf("%d", i); //输出i
    return 0;
}

2021:【例4.6】最大公约数

#include<stdio.h>

int main()
{
    
    
    int m, n, s; //m, n:输入的两个整数,s:m和n中较小的数字
    scanf("%d %d", &m, &n); //从标准输入读取m、n

    s = m > n ? n : m; //计算s的值

    while(s >= 1) //从s开始递减
    {
    
    
        if(m % s == 0 && n % s == 0) //如果s是m和n的公约数
        {
    
    
            printf("%d", s); //输出s
            return 0;
        }
        s--; //s递减1
    }

    return 0;
}

2022:【例4.7】最小n值

#include <stdio.h>

int main()
{
    
    
    double m, s = 0, i = 1; //m:输入的实数,s:1/1+1/2+...+1/i的和,i:当前的分母
    scanf("%lf", &m); //从标准输入读取m

    while(s < m) //当s小于m时
    {
    
    
        s += 1 / i; //计算新的s
        i++; //i自增1
    }

    printf("%.0lf", i - 1); //输出i-1
    return 0;
}

2023:【例4.8】数据统计

#include <stdio.h>

int main()
{
    
    
    int a, sum = 0, n = 0, mx = 0, mn = 1001; //a:当前输入的整数,sum:所有输入整数的和,n:输入的整数的数量,mx:所有输入整数中的最大值,mn:所有输入整数中的最小值
    while(scanf("%d", &a) != EOF) //当还有整数可以读取时
    {
    
    
        if(a > mx) //如果a大于当前的最大值
            mx = a; //更新最大值
        if(a < mn) //如果a小于当前的最小值
            mn = a; //更新最小值
        sum += a; //更新和
        n++; //更新数量
    }
    printf("%d %d %.3f", mn, mx, (double)sum/n); //输出最小值、最大值和平均值,平均值保留三位小数
    return 0;
}

1085:球弹跳高度的计算


#include <stdio.h>

int main()
{
    
    
    double h; //弹跳高度
    scanf("%lf", &h); //从标准输入读取h
    double sum = h; //sum:总距离,初始值设为h,即第一次下落的距离为h
    int i = 2; //i表示第几次落地
    while(i <= 10) //当落地次数小于等于10次时
    {
    
    
        h /= 2; //落地后弹跳高度变为原来的一半。h在运算后表示第i-1次落地后弹起的高度,也就是第i次下落的高度。
        sum += 2 * h; //球弹起距离h,下落距离h,经过2h距离后再次落地。运行这句后,此时sum表示第i次落地时小球经过的距离
        i++; //落地次数自增1
    }
    //此时sum为第10次落地时经过的距离,h为第10次下落的高度,第10次弹起的高度应该为h/2
    printf("%g\n%g\n", sum, h/2); //输出总距离和第10次弹起的高度,保留6位小数
    return 0;
}


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

int main()
{
    
    
    double h; //弹跳高度
    scanf("%lf", &h); //从标准输入读取h
    //根据等比数列求和公式S_n = a*(1-q^n)/(1-q)(a为首项,q为公比,n为项数),这里的a为下落的h,q为1/2,n为10
    //所以S_n = h*(1-(1/2)^10)/(1-1/2) = h*(1-1/(2^10))*2 = h*(3-1/(2^8))
    //第10次弹起的高度为下落高度的一半,也就是h/(2^10)
    printf("%g\n%g\n", h * (3 - 1 / pow(2, 8)), h / pow(2, 10)); //输出总距离和第10次弹起的高度,保留6位小数
    return 0;
}

1086:角谷猜想

#include <stdio.h>

int main()
{
    
    
    long long n; //不断乘3+1的过程中,数值会超出int的范围,因而得用long long类型 
    scanf("%lld", &n); //从标准输入读取n
    while(n != 1) //只要n不等于1,就继续循环
    {
    
    
        if(n % 2 == 1) //如果n是奇数
        {
    
    
            printf("%lld*3+1=%lld\n", n, n * 3 + 1); //输出运算过程
            n = n * 3 + 1; //更新n的值为n*3+1
        }
        else //如果n是偶数
        {
    
    
            printf("%lld/2=%lld\n", n, n / 2); //输出运算过程
            n /= 2; //更新n的值为n/2
        }
    }
    printf("End\n"); //输出结束标志
    return 0;
}

1087:级数求和

#include <stdio.h>

int main()
{
    
    
    double s = 0; //s:题中的Sn,用于存储1/1 + 1/2 + ... + 1/n的值
    int n = 0, k; //n:题中的n,用于记录当前计算到的项数;k:题中的k,用于判断是否满足条件
    scanf("%d", &k); //从标准输入读取k
    while(s <= k) //只要s小于等于k,就继续循环
    {
    
    
        n++; //n从1开始参与运算
        s += 1.0 / n; //1.0/n可以避免进行整除运算,使表达式是值是浮点型量,即求和项1/n
    }
    printf("%d\n", n); //输出满足条件的最小正整数n
    return 0;
}

1088:分离整数的各个数

#include <stdio.h>

int main()
{
    
    
    int n; //输入的数
    scanf("%d", &n); //从标准输入读取n
    while(n > 0) //只要n大于0,就继续循环
    {
    
    
        printf("%d ", n % 10); //输出n的个位数
        n /= 10; //更新n的值为n除以10取整
    }
    return 0;
}

1089:数字反转

#include <stdio.h>

int main()
{
    
    
    int n, d;
    scanf("%d", &n); //从标准输入读取n
    if(n == 0) //如果n为0,因为0无法进入下面的循环,所以直接输出并返回
    {
    
    
        printf("%d", n);
        return 0;
    }
    else if(n < 0) //如果n为负数,输出负号,并将n转换为正数
    {
    
    
        printf("-");
        n = -n;
    }
    int isPreZero = 1; //是否是输出前导0的状态,是为1,否为0
    while(n > 0) //只要n大于0,就继续循环
    {
    
    
        d = n % 10; //d为n的个位数,即分离出的一位数字
        if(isPreZero) //如果处于输出前导0的状态
        {
    
    
            if(d == 0) //如果d为0,直接跳过本次循环
                continue;
            else //否则,改变状态
                isPreZero = 0;
        }
        printf("%d", d); //输出d
        n /= 10; //更新n的值
    }
    return 0;
}

1090:含k个3的数

#include <stdio.h>

int main()
{
    
    
    int m, k;
    scanf("%d%d", &m, &k); //从标准输入读取m和k
    int c = 0; //用于统计数字m中3的个数 
    if (m % 19 == 0) //如果m是19的倍数
    {
    
    
        while(m > 0) //只要m大于0,就继续循环
        {
    
    
            if (m % 10 == 3) //如果m的个位数为3
                c++; //c加1
            m /= 10; //去掉m的个位数
        }
        if (c == k) //如果m的各位数字中有k个3 
            printf("YES\n");
        else
            printf("NO\n");
    }
    else //如果m不是19的倍数
        printf("NO\n");
    return 0;
}

2024:【例4.10】末两位数

#include <stdio.h>

int main()
{
    
    
    int n, res = 1;
    scanf("%d", &n); //从标准输入读取n
	int i = 1; //初始化i为1
    while(i <= n) //只要i小于等于n,就继续循环
	{
    
    
		res = (res * 1992) % 100; //计算(1992的i次方)对100取余的结果
		i++; //i加1
	}
 	printf("%d", res); //输出结果
	return 0;
}

2025:【例4.11】体操队

#include <stdio.h>

int main()
{
    
    
	int i = 1, a = 0;
	while(1)
	{
    
    //检查数字a是否满足条件
		a++;
  		if(a%2 == 1 && a%3 == 1 && a%4 == 1 && a%5 == 1 && a%6 == 1 && a%7==0)
        {
    
    
        	printf("%d", a);
        	break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44738632/article/details/134975047
今日推荐