1023 數字樂趣
公告,數字123456789是一個由1~9的9個沒有重複數字組成的9位數。將它翻倍我們將得到246913578,這恰好也是一個由1–9的9個沒有重複數字組成的9位數,只是兩者的排列方式不同。
現在你應該檢查是否有更多具有這個屬性的數字。即,對於一個給定的數字K,將它乘以2後得到的結果是否是隻包含原始數字中的數字的排列。
輸入規範
每個輸入包含一個測試用例,每個用例包含一個不超過20位數字的正整數。
輸出規範
對於每個測試用例,如果輸入數字加倍得到的數字僅由原始數字的排列組成,則在第一行中打印“Yes”,否則打印“No”。然後在下一行,打印源數字加倍後的數字。
輸入樣例
1234567899
輸出樣例
Yes
2469135798
解題思路
高精度加法。點擊跳轉C++高精度模板
AC代碼
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int cnt[10];
//加法
vector<int> add(vector<int> &A, vector<int> &B) {
vector<int> C; //保存答案,依然是從各位開始保存
//t保存進位
for(int i = 0, t = 0; i < A.size() || i < B.size() || t; i++) {
//或t的作用是方便最後進位保存至結果中
if(i < A.size()) {
t += A[i];
}
if(i < B.size()) {
t += B[i];
}
C.push_back(t % 10); //壓入本位數字
t /= 10; //計算進位
}
return C;
}
int main() {
string str;
cin >> str;
vector<int> vt;
for(int i = str.size() - 1; i >= 0; i--) {
vt.push_back(str[i]-'0');
cnt[str[i]-'0']++; //記錄原始數字個數
}
vector<int> res = add(vt, vt); //翻倍
//查看翻倍數字是否是原始數字重新排序得到
for(int i = 0; i < res.size(); i++) {
cnt[res[i]]--;
}
bool sign = true; //true表示是
for(int i = 0; i < 10; i++) {
if(cnt[i] != 0) {
sign = false;
break;
}
}
if(sign) {
cout << "Yes" << endl;
}else {
cout << "No" << endl;
}
for(int i = res.size() - 1; i >= 0; i--) { //輸出翻倍後數字
cout << res[i];
}
cout << endl;
return 0;
}