题解: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";
}
管理快点给这题上个数据!