趣味数字
题目 趣味数字
思路分析
20位 longlong也会爆
得用高精度
加倍可以理解成两个相加 也可以理解成乘2
所以用高精度加也行高精度乘也行
一个地方在于怎么判断加倍以后得到的数字是否可以由原数字的各数位重新排列得到
一开始想的是 用一个数组 值做下标计数 记录出现几次 如果每个数都只出现一次就满足
但这样一来逻辑就复杂了很多
其实可以直接将原数组和结果数组进行一个排序 再比较是否相等即可
因为每个数的不重复的 且在范围内的
代码实现
加法实现
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size())
t+=A[i];
if(i<B.size())
t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t)
C.push_back(1);
return C;
}
int main()
{
string a;
cin>>a;
vector<int> A;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
auto C=add(A,A);
auto copyc=C;
sort(A.begin(),A.end()),sort(copyc.begin(),copyc.end());
if(A==copyc)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
for(int i=C.size()-1;i>=0;i--)
cout<<C[i];
return 0;
}
乘法实现
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int>&A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)
{
if(i<A.size())
t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
return C;
}
int main()
{
string a;
cin>>a;
vector<int> A;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
auto C=mul(A,2);
auto copyc=C;
sort(A.begin(),A.end()),sort(copyc.begin(),copyc.end());
if(A==copyc)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
for(int i=C.size()-1;i>=0;i--)
cout<<C[i];
return 0;
}
💬 评论