题解:P9427 [蓝桥杯 2023 国 B] 拼数字

· · 题解

第一次写题解,写的不好请见谅

此题我个人分为两个部分 第一部分对排列出数据的最大值 第二部分将数据从最大值到最小值扫一遍,发现2023的倍数就输出并结束(从大往小扫可以保证是最大的倍数)

第一部分代码

long long int n,m,num=0,n2;
    cin>>n>>m;
    for (int i=0;i<=m-1;i++){//注释A 
        num+=3*pow(10,i);
    }
    num*=pow(10,n);//注释B 
    for (int i=0;i<=n-1;i++){//注释C
        num+=2*pow(10,i);
    }

注释A:这个循环第一个的数值是3,第二个是30,第三个是300 然后用num加起来,也就是3的个数(m个3) 我们假设输入为2 3则循环A过后num的值为333

注释B:将我们算出的num提位,按照我们的输入2 3经过这串代码后mun的值为33300

注释C:与循环A类似,只是3改为2

第二部分代码

n2=n; //赋值 
    for(int i=1;i<=m;i++){//注释E
        for(int j=1;j<=n;j++) {//注释D 
            num-=pow(10,n2);
            num+=pow(10,n2-1);
            n2--;
            if(num%2023==0) {//注释F
                cout<<num<<" ";
                return 0;
            } 
        }
        n2=n;
        n2+=i;
    }
    cout<<"-1";

注释D:这个循环会将处理好的num中的3向前提 如:33322变为33223

注释E:这个循环则使num重复提3

所以循环D和循环E可以使num从大到小变一次 而注释F的地方则可以对num进行一次扫描,来判断此时的num是不是2023的倍数,如果是,则输出并结束循环。

如果这个数从大到小都没有2023的倍数则输出-1

总代码

(由于没有数据我也不知道有没有ac,但是样例没问题,思路也感觉没问题)

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long int n,m,num=0,n2;
    cin>>n>>m;
    for (int i=0;i<=m-1;i++){
        num+=3*pow(10,i);
    }
    num*=pow(10,n); 
    for (int i=0;i<=n-1;i++){
        num+=2*pow(10,i);
    }
    n2=n; 
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++) {
            num-=pow(10,n2);
            num+=pow(10,n2-1);
            n2--;
            if(num%2023==0) {
                cout<<num<<" ";
                return 0;
            } 
        }
        n2=n;
        n2+=i;
    }
    cout<<"-1";

}

管理快点给这题上个数据!