B70
案例:找因数、长方形面积、美丽数字
引入
章前总览 三道 GESP 真题:枚举可能因数;枚举宽统计面积为 A 的长方形个数;读 n 个数统计美丽数字。
三道案例:
- 找因数:枚举 1~a
- 长方形:枚举宽 b,且 b*b≤A
- 美丽数字:%9==0 且 %8!=0
1 案例1:找因数
输入正整数 a(a≤1000),从小到大输出所有因数。
参考代码
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
for (int i = 1; i <= a; ++i) {
if (a % i == 0)
cout << i << endl;
}
return 0;
}
- 样例:6 → 1 2 3 6;10 → 1 2 5 10。
- 枚举 i=1..a,能整除就输出。
2 案例2:长方形面积
面积 A 固定,长宽都是正整数,约定长 ≥ 宽,问有多少种长方形(正方形算一种)。
如何避免重复
- 长宽对调算同一种,所以只枚举宽 b,且 b≤长 a。
- a×b=A ⇒ 枚举 b 时只要 A%b==0;b 最大到正方形:b*b≤A。
- 代码里甚至不用定义变量 a。
参考代码
#include <iostream>
using namespace std;
int main() {
int A;
cin >> A;
int cnt = 0;
for (int b = 1; b * b <= A; b++) {
if (A % b == 0) cnt++;
}
cout << cnt << endl;
return 0;
}
- 样例:A=4 → 2(2×2、4×1);A=6 → 2(3×2、6×1)。
3 案例3:美丽数字
美丽数字:是 9 的倍数,但不是 8 的倍数。统计 n 个数里有几个。
参考代码
#include <iostream>
using namespace std;
int main() {
int n, t;
cin >> n;
int cnt = 0;
for (int i = 1; i <= n; i++) {
cin >> t;
if (t % 9 == 0 && t % 8 != 0)
cnt++;
}
cout << cnt << endl;
return 0;
}
- 样例:1、9、72 → 只有 9 美丽,答案 1。
- 这是“读入循环 + 条件计数”,和第12章套路一致。
小结
枚举范围要想清楚:
找因数:1~a
长宽:只枚举较小边,到 sqrt(A)
读 n 个数:循环 n 次再筛选
✓
里程碑达成:
下一节练习:立方数、角谷猜想、回文数。