返回目录
题意
给出一个不超过20的整数,计算这个数的两倍是否为原数的全排列
样例(可复制)
1234567899
//output
Yes
2469135798
注意点
- 本题虽然是大整数运算,但过程中只需对大整数*2,所以直接当成字符串处理起来比较方便,如果使用大整数模板,代码量较大
- 对于数字是否为原数数位的一个全排列,可以使用count[10]对两个字符串的0-9进行计数比较即可,这是常见的散列做法
#include<bits/stdc++.h>
using namespace std;
int main(){
string a,b="";
cin>>a;
reverse(a.begin(),a.end());
int puls=0,count[10]={0};
for(int i=0;i<a.size();i++){
int tmp=(a[i]-'0')*2+puls;
puls=tmp/10;
b+=tmp%10+'0';
}
if(puls!=0)b+=puls+'0';
reverse(b.begin(),b.end());
for(auto c:a)count[c-'0']++;
for(auto c:b)count[c-'0']--;
for(int i=0;i<10;i++)
if(count[i]!=0){
cout<<"No\n"<<b;
return 0;duiyu }
cout<<"Yes\n"<<b;
return 0;
}