小知识点
-
int : $2^{31} - 1$ 约为 $2 * 10^{9}$
-
long long : $2^{63} - 1$ 约为 $9 * 10^{18}$
-
高精加!可以先复习一下 高精加模板题
-
高精乘!可以先复习一下 高精乘模板题
小分析
给一个数字加倍, A * 2
可以当作是 A + A
,题中输入数字不超过20位,如果写成longlong 也会爆掉,所以还是得写成字符串形式。两个大数相加,这时,便想到了我们的 高精加!2333
(其实高精乘也可以hh,高精乘是高精度乘以低精度)
小步骤
-
按字符串形式 输入
-
将乘法转为加法
-
将原数按要求和结果比较
- 那么如何判断:加倍以后得到的数字是否可以由原数字的各数位重新排列得到 呢?
可以将两个结果排序,都是vector型的,vector 类型支持字典序比较!相同就可以呗。
错误历程
最开始写高精加模板时,忘记给int t = 0
了,结果怎么都算不对hh气死了
后来忘记给原来的数字排序了,怎么输出都不对hh,看来还是得先想明白过程再写!
捋清思路先~
code
#include<iostream>
#include<algorithm>
#include<vector>
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 ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
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 CC = C; // 把结果先复制出来
// 得对两个都排序!
sort(CC.begin(), CC.end());
sort(A.begin(), A.end());
if (CC == A) puts("Yes");
else puts("No");
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
return 0;
}
但其实用高精乘也可以吧hhh,高精乘是高精度乘以低精度
高精乘 和 高精加差不多hh
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> mul (vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
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 CC = C; // 把结果先复制出来
// 得对两个都排序!
sort(CC.begin(), CC.end());
sort(A.begin(), A.end());
if (CC == A) puts("Yes");
else puts("No");
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
return 0;
}
排序nb