题目分析
使用高精度加法高精度加法板子求 这个数的两倍,存在一个vector中。
所谓高精度就是使用string来存大的数,然后模拟列竖式加法,结果一位一位压入数组vector中。
核心公式是
c[i] = a[i] +b[i]+ t;
//t是低位的进位
t = (a[i-1]+b[i-1]) / 10;
下面的问题是如何判断两个大数中“位”上出现的数是一样的呢? 比如 判断123和312 就是每位上出现的数字 就是1 和2 和3,而且出现次数一样;而123和1231 就不一样,尽管两者都只出现了1 和2 和3 这三个数,但是出现次数是不一致的。
由于高精度的数据是存在vector中的,我们只需要对两个vector进行排序,如果两个序列完全相同即为所求。
vector支持比较运算:按照字典序。
vector<int> a, b;
可以有 a<b a==b a>b 等两个vector之间的比较运算
ac代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string A;
vector<int> a;
cin>>A;
for(int i=A.size()-1;i>=0;i--){
a.push_back(A[i]-'0');
}
vector<int> b; //存储原数的两倍
int t = 0;
for(int i=0; i<a.size();i++){
int s = a[i] +a[i] +t;
b.push_back( s % 10);
t = s/ 10;
}
if(t) b.push_back(1);
vector<int> c =b;
sort(c.begin(),c.end());
sort(a.begin(),a.end());
if(c==a){
cout<<"Yes"<<endl;
for(int i=b.size()-1;i>=0;i--)
cout<<b[i];
}
else{
cout<<"No"<<endl;
for(int i=b.size()-1;i>=0;i--)
cout<<b[i];
}
}