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.定理法

两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。