只要给定的条件为真,while 循环语句会重复执行一个目标语句。
语法
C++ 中 while 循环的语法:
while (condition) { statement(s); }
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。
当条件为假时,程序流将继续执行紧接着循环的下一条语句。
for (initialization; condition; increment) { statement; }
do { statement; } while (condition);
终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
引起循环跳过主体的剩余部分,立即重新开始测试条件。
将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。
如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。
实例
#include <iostream> using namespace std; int main () { for(;;) { printf("This loop will run forever.\n"); } return 0; }
想退出多重循环怎么办?
return
结束函数return 0;
,或者exit(0);
https://atcoder.jp/contests/abc215/tasks/abc215_b
输入n,找到最大的k,使得2**k<=n
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 下取整
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }