测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
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 次再筛选
里程碑达成:

下一节练习:立方数、角谷猜想、回文数。