跳转至

while 循环

while 循环

while 循环语法格式

while (条件语句) {
    ...
    ...
}

数位拆分(重点)

判断整数的位数

int n;
cin >> n;

int cnt = 0;
while (n) {
    n /= 10;
    cnt++;
}

cout << cnt;

输出各个位上的数字之和

int n;
cin >> n;

int sum = 0;
while (n) {
    sum += n % 10;  // 当前的个位
    n /= 10;
}

cout << sum;

数字反转

cin >> n;

int t = 0;
while (n) {
    t = t * 10 + n % 10; // 重点语句
    n /= 10;
}

cout << t;

负数的数字反转

// 这个思考题,留给你吧
// 提示,从带余除法出发

数字替换

B4496 [GESP202603 一级] 数字替换,把数中的 4 全都替换成 8

#include <iostream>

using namespace std;

int main() {
    int a, b = 0, t = 1;
    cin >> a;

    while(a) {
        if(a % 10 == 4) b += t * 8;
        else b += t * (a % 10);

        a /= 10;
        t *= 10;
    }

    cout << b;

    return 0;
}

不定次输入

输入 n 个数,输出这 n 个数的和(但没有给 n 是多少)

输入样例1 7 3 4 5

输出样例20
int sum = 0, x;
while (cin >> x) {
    sum += x;
}

cout << sum;
// 也可以这样写
int sum = 0, x;
while (scanf("%d", &x) == 1) {
    sum += x;
}

cout << sum;

可能你很难理解,cinscanf 竟然还有返回值,是的,有返回值。

cin 返回是否成功读入

scanf 返回成功读入几个数

如果是不定次输入,编译运行,输入样例完毕之后,需要输入一个大写的 EOF,才可以终止输入。

否则,计算机会一直等待你输入下一个数字,看起来像是计算机没有反应了一样。

其实,计算机一直在等待你按键盘。

ctrl + z 也可以终止输入。

image-2025101111305781

freopen

使用while (cin >> x),在本地调试的时候,有时候会有点麻烦,就是无法有效终止键盘的输入。

这时候,可以搭配使用freopen语句(文件重定向)。

原来是从标准输入设备-键盘,读入数据。现在改成从指定的文件读入数据。

#include <bits/stdc++.h>

using namespace std;

int main() {
    freopen("1.in", "r", stdin);

    int a, b;
    cin >> a >> b;

    cout << a + b << endl;

    return 0;
}

其中,1.in文件是一个和当前这个.cpp文件,在同一个文件目录下的文件。

1.in文件的创建/编辑方法如下:

  1. 新建一个文本文档
  2. 重命名成1.in
  3. 将1.in文件拖拽到DEV C++中,进行编辑内容

image-2026051114022577

freopen的三个参数分别是什么意思

freopen("文件名", "模式", 标准流);
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);

freopen的使用注意事项

在本地调试的时候,如果使用了freopen。

提交OJ评测的时候,要注意OJ上的要求,一般OJ是从标准输入,就是提交的时候,要把freopen注释掉。

对于CSP-J/S复赛的比赛环境,比赛要求代码从文件读入,这种比赛就必须写上freopen,并且还要一定写对,不能错一点,否则肯定爆零。