原文鏈接:我的個人博客
原題鏈接
考點
大整數運算
思路
要求給定一個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;
}
}