第四章 循环结构的程序设计
第一节 for语句
2016:【例4.1】for循环求和
c
复制代码
#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】输出偶数
c
复制代码
#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】输出奇偶数之和
c
复制代码
#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】求阶乘
c
复制代码
#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:求平均年龄
c
复制代码
#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:均值
c
复制代码
#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:求整数的和与均值
c
复制代码
#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:最高的分数
c
复制代码
#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:最大跨度值
c
复制代码
#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:奥运奖牌计数
c
复制代码
#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:奇数求和
c
复制代码
#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:满足条件的数累加
c
复制代码
#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:整数的个数
c
复制代码
#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:与指定数字相同的数的个数
c
复制代码
#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:乘方计算
c
复制代码
#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:人口增长
c
复制代码
#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:菲波那契数
c
复制代码
#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:鸡尾酒疗法
c
复制代码
#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:救援
c
复制代码
#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:津津的储蓄计划
c
复制代码
#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:药房管理
c
复制代码
#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:正常血压
c
复制代码
#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位数
c
复制代码
#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:求分数序列和
c
复制代码
#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:计算分数加减表达式的值
c
复制代码
#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:余数相同问题
c
复制代码
#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:分苹果
c
复制代码
#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:求小数的某一位
c
复制代码
#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:计算星期几
c
复制代码
#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:幂的末尾
c
复制代码
#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;
}