1023 Have Fun with Numbers (20分)
Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.
Sample Input:
1234567899
Sample Output:
Yes
2469135798
题意是给定一个数字字符串,把它乘2后与原字符串比对是否新字符串是原字符串数字的另一种排列
排列不仅要包含原字符串的所有数字,也要有相同的数字数目
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define N 2
string str;
string result;
int book[10];
int carry_forward = 0;//保存进位
int main() {
cin >> str;
int len = str.size();
for (int i = len; i >= 1; i--) {
int num = str[i - 1] - '0';
book[num]++;
num = num * N + carry_forward;
if (num > 9) {
carry_forward = num / 10;
num = num % 10;
} else {
carry_forward = 0;
}
result += to_string(num);
book[num]--;
}
result += carry_forward > 0 ? to_string(carry_forward) : "";
if (count(book, book + 10, 0) == 10) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
reverse(result.begin(), result.end());//反转字符串
cout << result << endl;
return 0;
}
这个程序把宏常量改一改可以当作字符串乘法运算
没必要用栈,C++有反向函数