--- title: "趣味数字" created: 2025-11-28 tags: - 算法 --- # 趣味数字 ## 题目 [趣味数字](https://www.acwing.com/problem/content/description/1502/) ![[image-7cad5ae8.png]] ## 思路分析 ![[image-43c1a5b7.png]] 20位 longlong也会爆 得用高精度 加倍可以理解成两个相加 也可以理解成乘2 所以用高精度加也行高精度乘也行 一个地方在于怎么判断加倍以后得到的数字是否可以由原数字的各数位重新排列得到 一开始想的是 用一个数组 值做下标计数 记录出现几次 如果每个数都只出现一次就满足 但这样一来逻辑就复杂了很多 其实可以直接将原数组和结果数组进行一个排序 再比较是否相等即可 因为每个数的不重复的 且在范围内的 ## 代码实现 **加法实现** ```cpp #include using namespace std; vector add(vector&A,vector&B) { vector C; int t=0; for(int i=0;i>a; vector 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"<=0;i--) cout< using namespace std; vector mul(vector&A,int b) { vector C; int t=0; for(int i=0;i>a; vector 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"<=0;i--) cout<