第二节 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;
}