循环语句的选择
- 主要考虑因素-循环控制方式
- 事先给定循环次数,首选for
- 通过其他条件控制循环,考虑while 或do-while
例4-8 输入一批学生的成绩,求最高分(for)
题解
- 假设读入的读入的第一个成绩是最高分,接下来每读入的一个数都要和最高分比较,如果大于之前的最高分,则将其赋值给max,以此循环
例4-9 Filbonacci 数列问题
题解
- 需要额外处理前两个月
- 此后用循环,递归,反复将前两个月的总数赋值给两个变量
代码
int N, sum, count, x, y;
scanf("%d", &N);
sum = 0;
count = 1;
x = 1;
y = 1;
while ( sum < N )
{
if ( N == 1 )
{
sum = 1;
count ++;
}
else
{
while ( count < 3 )
{
sum = 1;
count++;
}
if ( count % 2 != 0 )
{
sum = x + y;
x = sum;
count++;
}
else
{
sum = x + y;
y = sum;
count++;
}
}
}
printf("%d\n", count - 1);
例4-10 素数问题
题目
输入 2 个正整数 m 和 n(1<=m<=n<=500),输出 m
到 n 之间的全部素数,每行输出 10 个。
题解
- 用一个循环遍历从m到n的所有数,如果是素数,则输出
- 在循环的过程中同时计数,当计数的变量能被10整除时,输出一个换行符
- 第一层循环遍历从m到n的所有数,然后判断k是否为1或2,若不是,则进入第二层循环,另取一个变量i,让其从1开始到sqrt(k)+1结束,遍历,再次循环中插入判断语句,如果k能被i整除,则改变判断变量的值并结束循环,到k的下一个数,如果所有的i都不能被k整除,则判断变量的值不变,输出
例4-11 古典算术问题-搬砖问题
题目
某地需要搬运砖块,已知男人一人搬 3 块,女人一人搬 2 块,小孩两人搬 1 块.
问用 n 人正好搬 n 块砖,有多少种搬法?
题解
- 首先要挖掘其中的制约关系,从而提高效率
- 男人最多有n/3个,女人最多有n/2个,小孩最多有n-man-women个
- 此题需要用到三层循环,最外层为man的循环,最内层为child的循环
例4-12 找零钱问题
题目
有足够数量的 5 分、 2 分和 1 分的硬币,现在要用这些硬币来
支付一笔小于 1 元的零钱 money,问至少要用多少个硬币?
输入零钱,输出硬币的总数量和相应面额的硬币数量。
题解
- 硬币总数最小:优先考虑使用面值大的硬币,采用三重循环嵌套,按照 5 分、 2 分和 1 分的顺序,从上限 (money/币值) 到下限 (0)
本章总结
- 循环结构以及循环机制
- break与continue语句
- 嵌套循环
- 综合程序设计(循环结构)
- 常用算法
- 例题:求 π、拆分整数、求素数、猜数、求最值、求 fibonacci、找零钱
- 习题:求水仙花数、求最大公约数/最小公倍数、求 ddd