day09:while循环
while知识点
循环:如果条件为真,就一直执行,直到条件不为真
bool flag = true; //true, false, 1, 0
while(flag){
//循环体
}
//解释:如果满足flag为真,就执行循环体,直到flag不为真,退出
1. 输入n, 输出1-n
【题目描述】输入n, 输出1-n(1 2 3 4 5...n)。
int n; cin>>n;
int i=1;
while(i<=n){
cout<<i<<" ";
i++;
}
2. 平均分
【题目描述】考试结束后,老师想计算全体学生的平均分,你能帮助老师吗?
现在无法知道参考人数,但是知道参加考试的人都不是0分。
所以,提供给你的若干个考试成绩,以0作为计算的结束标志。
输入样例:90 0
输出样例:90
输入样例:90 89 90 0
输出样例:89.6667
#include <iostream>
using namespace std;
int main() {
double score, tot=0;
int pep=0; cin>>score;
while(score!=0) {
tot += score ;
pep++;
cin>>score;
}
cout<<tot/pep<<endl;
return 0;
}
3. 质数判断
【题目描述】判断给定的正整数n(保证在正整数范围内)是否为质数,是,输出yes,否则,输出no。
理论:如果n能被[2,n-1]中某个整数整除,则证明n是合数,不是质数(素数)
#include<bits/stdc++.h>
using namespace std;
int main() {
int i=2, n; bool flag=1; //假设n是质数
scanf("%d", &n);
while(i<n) {//i的取值范围 [2, n-1]
if(n%i==0) {//证明是合数
flag=0;
}
i++;
}
if(flag==0 || n<2) printf("合数");
else printf("质数");
return 0;
}
4. 输入一个正整数,输出其位数
【题目描述】输入一个正整数,输出其位数
输入样例:123
输出样例:3
#include<iostream>
using namespace std;
int main(){
int n, ans=1;//这个数至少是一位数
cin>>n;
while(n>9){
n /= 10;//去掉个位数
ans++;
}
cout<<ans;
return 0;
}
5. 输入任意两个自然数,求他们的最大公约数
#include<iostream>
using namespace std;
int main(){
int a,b; cin>>a>>b;
for(int i=min(a,b); i>=1; i--){
if(a%i==0 && b%i==0) {
cout<<i; break;
}
}
return 0;
}
补充知识:最大公约数&最小公倍数
求最大公约数的三种方法:
1.最小递减法
先找a,b的最小值,判断该值能否同时被a,b整除,如果可以该数就是答案,否则每次-1,继续判断,直到找到答案。
#include<iostream>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
for(int i=min(a,b); i>=1; i--) {
if(a%i==0 && b%i==0) {
cout<<i;
break;
}
}
cout<<a;
return 0;
}
2.更相减损法
a-b=c,则a,b的最大公约数就是b,c的最大公约数,如果c=0,a就是答案。
3.辗转相除法
a/b=q...r,则a,b的最大公约数就是b,r的最大公约数,如果r=0,则b就是答案。
#include<iostream>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
while(b!=0) {
int r = a%b;
a = b;
b = r;
}
cout<<a;
return 0;
}
求最小公倍数的两种方法:
1.最大递增法
先找a,b的最大值,判断该值能否同时整除a,b,如果可以该数就是答案,否则每次+1,继续判断,直到找到答案。
#include<iostream>
using namespace std;
int main() {
int a,b; cin>>a>>b;
for(int i=max(a,b); ; i++) {
if(i%a==0 && i%b==0) {
cout<<i;
break;
}
}
return 0;
}
2.定理法
两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。