循环

while

只要给定的条件为真,while 循环语句会重复执行一个目标语句。
语法

C++ 中 while 循环的语法:

while (condition)
{
    statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。

当条件为假时,程序流将继续执行紧接着循环的下一条语句。

for

for (initialization; condition; increment)
{
    statement;
}

do while

do
{
    statement;
}
while (condition);

break 语句

终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。

continue 语句

引起循环跳过主体的剩余部分,立即重新开始测试条件。

goto 语句

将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

无限循环

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。
实例

#include <iostream>
using namespace std;
int main ()
{
    for(;;)
    {
        printf("This loop will run forever.\n");
    }
    return 0;
}

循环

想退出多重循环怎么办?

  1. flag变量,加很多 if break
  2. 使用函数,return结束函数
  3. 直接结束程序,return 0;,或者exit(0);

多层循环

循环练习题

abc215_b log2(N)

https://atcoder.jp/contests/abc215/tasks/abc215_b
输入n,找到最大的k,使得2**k<=n

参考代码

题解

abc207_b Hydrate

https://atcoder.jp/contests/abc207/tasks/abc207_b
输入正整数A, B, C, D,问是否存在自然数x使得 A + x * B <= x * C * D
如果存在输出最小的x,如果不存在输出-1

A + x * B <= x * C * D
A <= x * (C * D - B)
A是正数
如果 C * D - B <= 0,那么不可能成立
如果 C * D - B > 0
那么最小的 x 是 A / (C * D - B) 上取整
x / y 上取整 等于 (x + y - 1) / y 下取整

参考代码

题解

abc206_b Savings

https://atcoder.jp/contests/abc206/tasks/abc206_b
第1天存1块钱,第2天存2块钱……第i天存i块钱,
问多少天能存够n的钱。

参考代码

#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
	cin >> n;
	cout << int(sqrt(2 * n) + .5) << endl;
}

题解

abc204_b Nuts

https://atcoder.jp/contests/abc204/tasks/abc204_b
有n个树,每个树上有一些坚果,如果坚果的个数大于10,会拿到只剩10个,否则一个都不拿,问一共拿几个?

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, x, s;
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		s += max(x - 10, 0);
	}
	cout << s << endl;
	return 0;
}

题解

abc203_b AtCoder Condominium

https://atcoder.jp/contests/abc203/tasks/abc203_b

第i层楼,第j个房间的门牌号是i0j,一共n层楼,每层k个房间,问所有门牌号之和。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
    cin>>n>>m;
    cout<<n*(1+m)*m/2+m*(1+n)*n/2*100;
}

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, k;
int main()
{
	cin >> n >> k;
	cout << n * k * (100 * n + k + 101) / 2 << endl;
	return 0;
}

题解

abc200_b 200th ABC-200

https://atcoder.jp/contests/abc200/tasks/abc200_b

对n做操作:如果n是200的倍数,/=200,否则在n的数字串末尾加上200三位数字

输入n,和k,输出n做k次操作的结果

#include<bits/stdc++.h>
int main(){
    long long n,k;
    scanf("%lld%lld",&n,&k);
    while(k--){
        if(n%200==0)n/=200;
        else n=n*1000+200;
    }
    printf("%lld\n",n);
}

参考代码

#include <bits/stdc++.h>
using namespace std;
long long n, k;
int main()
{
	cin >> n >> k;
	for (int i = 0; i < k; i++)
	{
		if (n % 200 == 0)
		{
			n /= 200;
		}
		else
		{
			n = n * 1000 + 200;
		}
	}
	cout << n << endl;
	return 0;
}

题解

abc193_b Play Snuke

https://atcoder.jp/contests/abc193/tasks/abc193_b
n个商店,走到第i个商店需要Ai分钟,价格是Pi,库存是Xi
如果Xi<=Ai这个店会在自己走到之前卖完
需要选一个有存货的商店买一个商品,问至少需要多少钱
如果买不到输出-1

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, a, p, x, z = 2e9;
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a >> p >> x;
		if (x > a)
		{
			z = min(z, p);
		}
	}
	if (z == 2e9)
	{
		z = -1;
	}
	cout << z << endl;
	return 0;
}

题解

abc191_b Remove It

https://atcoder.jp/contests/abc191/tasks/abc191_b

输入n,x,和一个长度为n的数组A,把A中的x都删掉,输出剩下的数字保持原序。

#include <bits/stdc++.h>
using namespace std;
int main() {int X, A; for (cin >> X >> X; cin >> A;) if (A - X) cout << A << " ";}

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, x, a;
int main()
{
	for (cin >> n >> x; cin >> a;)
	{
		if (a != x)
		{
			cout << a << " ";
		}
	}
	return 0;
}

题解

abc190_b Magic 3

https://atcoder.jp/contests/abc190/tasks/abc190_b
n个技能,每个技能施法时间Xi,伤害Yi,问有没有施法时间<S且伤害>D的技能

#include <bits/stdc++.h>
using namespace std;
int n, s, d, x, y;
int main()
{
    cin >> n >> s >> d;
    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        if (x < s && y > d)
        {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
    return 0;
}

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, s, d, x, y;
int main()
{
	cin >> n >> s >> d;
	for (int i = 0; i < n; i++)
	{
		cin >> x >> y;
		if (x < s && y > d)
		{
			cout << "Yes" << endl;
			return 0;
		}
	}
	cout << "No" << endl;
	return 0;
}

题解

abc189_b Alcoholic

https://atcoder.jp/contests/abc189/tasks/abc189_b
n杯酒,一杯一杯喝,每一杯有容量V和浓度P,问喝到第几杯,已经喝的酒精>X

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, x, v, p;
int main()
{
	cin >> n >> x;
	x *= 100;
	for (int i = 1; i <= n; i++)
	{
		cin >> v >> p;
		if (x >= v * p)
		{
			x -= v * p;
		}
		else
		{
			cout << i << endl;
			return 0;
		}
	}
	cout << -1 << endl;
	return 0;
}

题解

  1. 循环
    1. while
    2. for
    3. do while
    4. break 语句
    5. continue 语句
    6. goto 语句
    7. 无限循环
    8. 循环
  2. 多层循环
  3. 循环练习题
    1. abc215_b log2(N)
    2. abc207_b Hydrate
    3. abc206_b Savings
    4. abc204_b Nuts
    5. abc203_b AtCoder Condominium
    6. abc200_b 200th ABC-200
    7. abc193_b Play Snuke
    8. abc191_b Remove It
    9. abc190_b Magic 3
    10. abc189_b Alcoholic