题目:
自测-4 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
自己的代码:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
string origin_num;
cin >> origin_num;
int num(0), carry(0); // 进位
string rev_result;
char c;
bool flag(true);
for (string::reverse_iterator riter = origin_num.rbegin(); riter != origin_num.rend(); ++riter)
{
num = 0;
num = *riter - '0';
num = 2*num + carry;
carry = num / 10;
num = num % 10;
c = num + '0';
rev_result.push_back(c);
}
if (carry)
{
c = carry + '0';
rev_result.push_back(c);
flag = false;
}
string true_result;
for (string::reverse_iterator riter = rev_result.rbegin(); riter != rev_result.rend(); ++riter)
{
c = *riter;
true_result.push_back(c);
if (string::npos == origin_num.find(c, 0))
flag = false;
}
if (flag)
cout << "Yes" << endl;
else
cout << "No" << endl;
cout << true_result;
return 0;
}
求教大神指点一下,谢谢