PAT (Advanced Level) 1023 Have Fun with Numbers (20 分)
按位做大数乘法即可
Python:
import sys
from math import *
str_in = input()
length = len(str_in)
b = [int(n) for n in str_in.split()]
n = b[0]
a = [0]*100
k = 0
while int(n) > 0 : #现在的a是逆序
k = k + 1
a[k] = n % 10
n //= 10
a[k + 1] = 0
#for i in range(1, k + 1):
# print(a[i],end = '')
#print()
vis = [0]*12
for i in range(1, k + 1):
index = int(a[i])
vis[index] = vis[index] + 1
for i in range(1, k + 1):
a[i] = int(a[i] * 2)
for i in range(1, k + 1):
t = a[i]
a[i] = int(t % 10)
a[i + 1] += int(t // 10)
#for i in range(1, k + 1):
# print(a[i],end = '')
pre = a[k + 1]
if pre:
vis[pre] = vis[pre] - 1
for i in range(1, k + 1):
vis[int(a[i])] -= 1
flag = 1
for i in range(10):
if vis[i] != 0:
flag = 0
break
if flag:
print('Yes')
else:
print('No')
if pre:
print(pre, end = '')
for i in range(k, 0, -1):
print(a[i], end = '')
print()
C++:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define ll long long int
#define LL ll
#define INF 0x3f3f3f3f
const int maxn = 1e5 + 10;
int a[maxn];
int vis[12];
int main() {
string str;
cin >> str;
int len = str.length();
for (int i = 0; i <= 9; i++) {
vis[i] = 0;
}
for (int i = 0; i <= len; i++) {
a[i] = 0;
}
for (int i = 0; i < str.length(); i++) {
int t = str[i] - '0';
a[i + 1] = t * 2;
vis[t]++;
}
/*for (int i = 1; i <= len; i++) {
cout << a[i] << " ";
}*/
for (int i = len; i >= 1; i--) {
int t = a[i];
a[i] = t % 10;
a[i - 1] += (t / 10);
}
for (int i = 0; i <= len; i++) {
if (a[i] == 0 && i == 0) continue;
vis[a[i]]--;
}
int flag = 1;
for (int i = 0; i <= 9; i++) {
if (vis[i] != 0) {
flag = 0; break;
}
}
if (flag) {
puts("Yes");
}
else {
puts("No");
}
if (a[0] != 0) {
printf("%d", a[0]);
}
for (int i = 1; i <= len; i++) {
//if (i ^ 1) printf(" ");
printf("%d", a[i]);
}
printf("\n");
}
//_CRT_SECURE_NO_WARNINGS