暑假算法练习Day6

最近开始了实验室的生活,并且学习了bullet journal。希望接下来的每一天都能完成所有的任务。

1012 数字分类 (20 分)

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

  • \(A_1\) = 能被 5 整除的数字中所有偶数的和;
  • \(A_2\)​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 \(n_1−n_2+n_3−n_4⋯\)
  • \(A_3\) = 被 5 除后余 2 的数字的个数;
  • \(A_4\) = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
  • \(A_5\) = 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 N 个正整数,按题目要求计算 A1~A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出 N

输入样例 1:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例 1:

30 11 2 9.7 9

输入样例 2:

8 1 2 4 5 6 7 9 16

输出样例 2:

N 11 2 N 9

解题分析及代码:

本题其实比较简单,分情况依次讨论即可。但需要注意的是,在处理\(A_2\)​的时候,不能以\(A_2\)​是否为0作为其是否存在的判断依据,因为交错求和结果\(A_2\)​是可能为0的,所以我采用对其个数是否为0进行判断。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <iomanip>
using namespace std;
int cmp(int a,int b){
    return a>b;
}
int main() {
    int n=0;
    cin >> n;
    int a=0;
    int a1=0,a2=0,a3=0,a5=0;
    int A2[1005]={0};
    int n2=0,n4=0;
    double a4=0;
    for(int i=0;i<n;i++){
        cin >> a;
        if(a%10==0) a1+=a;  //A1
        else if(a%5==1) A2[n2++]=a; //A2
        else if(a%5==2) a3++;//A3
        else if(a%5==3){//A4
            n4++;
            a4+=a;
        }
       else if(a%5==4&&a>a5)a5=a;//A5
    }
    if(n4!=0)a4/=n4;
    if(n2!=0){
        int b=1;
        for(int i=0;i<n2;i++){
            A2[i]*=b;
            a2+=A2[i];
            b*=-1;
        }
    }
    if(a1==0) cout << 'N'; //A1output
    else cout << a1 ;
    cout <<" ";
    
    if(n2==0) cout << 'N';//A2output
    else cout << a2 ;
    cout <<" ";
    
    if(a3==0) cout << 'N';//A3output
    else cout << a3 ;
    cout <<" ";
    
    if(n4==0) cout << 'N';//A4output
    else cout <<setiosflags(ios::fixed)<<setprecision(1)<< a4 ;
    cout <<" ";
    
    if(a5==0) cout << 'N';//A5output
    else cout << a5 ;
    cout << endl;
    return 0;
}

1013 数素数 (20 分)

\(P_i\)表示第\(i\)个素数。现任给两个正整数 \(M≤N≤104\),请输出 \(P_M\)\(P_N\) 的所有素数。

输入格式:

输入在一行中给出 \(M\)\(N\),其间以空格分隔。

输出格式:

输出从\(P_M\)\(P_N\) 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

解题分析及代码:

本题其实是对素数判断的另一种运用,会写素数判断,其实问题就迎刃而解啦!

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
bool IsPrime(int a){
    int b=sqrt(a);
    if(a==1) return false;
    else if (a==2) return true;
    else{
        for(int i=2;i<=b;i++){
            if(a%i==0) return false;
        }
        return true;
    }
}
int main() {
    int m,n;
    cin >> m >> n;
    int n1=0,n2=0;
    for(int i=2;n1<n;i++){
        if(IsPrime(i)==true){
            n1++;
            if(n1>=m){
                n2++;
                cout << i;
            if(n2%10==0) cout << endl;
            else if(n1!=n) cout <<" ";
            }
        }
    }
    return 0;
}
posted @ 2021-07-27 10:37  平和Kenn  阅读(52)  评论(0编辑  收藏  举报