目录
💟这里是CS大白话专场,让枯燥的学习变得有趣!
💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!
💟好记性不如烂键盘,自己总结不如收藏别人!
🧡问题描述
题目链接:PTA | 程序设计类实验辅助教学平台
💌给出一个由1-9组成的数,判断乘2之后是否为原数各位重排列。这里可能出现0的情况,我本来想着判断一下如果乘2之后的数出现0则肯定为No,因为原数没有0,但是加了这句测试点3,5过不了,不加的话测试点2过不了。后面直接用位数比较如果位数不一样则肯定为No,就都过了,想了半天没想明白原因,求大佬帮忙看看~~
🧡代码
#include <string>
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
string N;
int M[21],Msize,Nsize;
int Nnum[10],Mnum[10];
fill(Nnum,Nnum+10,0);
fill(Mnum,Mnum+10,0);
cin >> N;
Nsize = N.size();
int s = 0;
int add = 0;
for(int i=Nsize-1;i>=0;i--){
int I = N[i]-'0';
Nnum[I]++;
//M从低位往高位存,最后倒序输出
M[s++] = (I*2+add)%10;
add = (I*2+add)/10;
}
if(add!=0){
M[s] = add;
Msize = s+1;
}else{
Msize = s;
}
int flag=1;
for(int i=0;i<Msize;i++){
if(M[i]!=0) Mnum[M[i]]++;
//else flag = 0; //不加这句测试点2过不了,加了3和5过不了,头疼
}
if(Msize!=Nsize) flag = 0; //直接用长度判断就过了,神奇
for(int i=1;i<10;i++){
if(Nnum[i]==Mnum[i]) continue;
else flag = 0;
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
for(int i=Msize-1;i>=0;i--){
cout << M[i];
}
cout << endl;
return 0;
}