题目链接
因为至多20位数字,使用unsigned long long只能得到一部分分数,因此需要手动模拟一下大整数的乘法运算,通过carry变量记录进位,乘到最后还剩下的进位要记得输出,实际相当于进行了一个0+carry。
完整代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main(){
string x;
cin >> x;
vector<int> bignum;
int count[10]={0};
for(int i=0;i<x.size();i++){
int tmp=x[i]-'0';
bignum.push_back(tmp);
count[tmp]++;
}
int carry=0;
for(int i=bignum.size()-1;i>=0;i--){//从低位到高位进行运算的时候要注意
int tmp=bignum[i]*2+carry;//进到最高位可能没地方存
carry=tmp/10;
bignum[i]=tmp%10;
}
bool flag=true;
for(int i=0;i<bignum.size();i++){
count[bignum[i]]--;
if(count[bignum[i]]<0){
flag=false;
break;
}
}
if(flag) cout << "Yes";
else cout << "No";
cout << endl;
if(carry!=0) cout << carry;//进到最高位要输出,否则卡样例2和最后一个样例
for(int i=0;i<bignum.size();i++)
cout << bignum[i];
return 0;
}