测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
B58

案例:求幂、奇数和、统计位数

引入

章前总览 while 与 for 等价:初值放循环前,更新放循环里,条件写在 while(...)。位数题用“除以 10 砍甘蔗”。

三道案例:

  • aⁿ:重复乘 a
  • 奇数和:s += (2*i-1)
  • 位数:while(t) { cnt++; t/=10; }

1 案例1:求 a 的 n 次方(while)

输入 a、n,输出 aⁿ。样例:2 5 → 32。

</> while 写法

#include <iostream>
using namespace std;

int main() {
    int a, n, t = 1, i = 1;
    cin >> a >> n;
    while (i <= n) {
        t = t * a;
        i++;
    }
    cout << t << endl;
    return 0;
}
  • 对比 for:初值、条件、更新拆开写,循环体常需花括号。
  • 也可用 do-while(本题 n 为正整数时结果相同)。

2 案例2:求 1+3+5+…+(2n−1)

用 while 累加奇数。答案也等于 n×n。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int i = 1, s = 0;
    int n;
    cin >> n;
    while (i <= n) {
        s = s + (2 * i - 1);
        i++;
    }
    cout << s << endl;
    return 0;
}
  • 样例:n=100 → 10000。

3 案例3:求一个整数的位数

输入正整数 n,输出位数。样例:67089 → 5。

砍甘蔗法

  • t%10 取个位;t/=10 砍掉个位。
  • 反复直到 t 变成 0;每次砍之前位数 +1。
  • 用临时变量 t,避免破坏原来的 n(若后面还要用)。

</> 参考代码

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int cnt = 0;
    int t = n;
    while (t) {
        cnt++;
        t = t / 10;
    }
    cout << cnt << endl;
    return 0;
}
小结

while 三件套:

循环前:给循环变量初值
while (条件) {
    做事;
    修改循环变量;  // 别忘!
}
里程碑达成:

下一节练习:折纸、折半、各位数字之和。