原文链接:我的个人博客
原题链接
考点
大整数运算
思路
要求给定一个k位的数字,判断它的两倍是否是原来k的数的另一种排列。首先题目中说k可能有20位,因此即使用长整型也是没有办法表示的,何况还要乘以2.因此这里涉及到大整数的加法。判断2倍之后的数是否为原来k个数的排列,也就是再问:原来的数和二倍之后的数是否由相同的数字组成,只是排列的方式可能不同。我这里直接将两个数的每一位数push_back进两个vector容器中,然后判断排序后的容器是否相同。
代码
#include <bits/stdc++.h>
using namespace std;
string Double(string a){
//计算a*a
a = a.substr(a.find_first_not_of("0"));
string c(a.length()+1,'0');
reverse(a.begin(),a.end());
int t=0,i;//t
for(i=0;a[i];i++){
t += (a[i]-'0')+(a[i]-'0');
c[i] = t%10+'0';
t /= 10;//进位
}
c[i] = t+'0';
reverse(c.begin(),c.end());
return c.substr(c.find_first_not_of("0"));
}
int main(){
string a;
cin>>a;
string b = Double(a);
vector<int>v1,v2;
for(int i=0;a[i];i++){
v1.push_back(a[i]-'0');
}
for(int i=0;b[i];i++){
v2.push_back(b[i]-'0');
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
if(v1==v2){
cout<<"Yes"<<endl;
cout<<b;
}else{
cout<<"No"<<endl;
cout<<b<<endl;
}
}