题目要求
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
翻译
输入一个数,计算这个数的双倍,如果得到的数是输入数的重新排列,则输出Yes和得到的数,否则输出No和得到的数.
代码
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string str;
int h[10];
string multiply(string num1, string num2) {
// 结果最大有num1.len+num2.len 注意最后去掉前面的前导0
string ans="";
vector<int> val(num1.length()+num2.length(),0);
for(int i=num1.length()-1;i>=0;i--){
for(int j=num2.length()-1;j>=0;j--){
int p1=i+j, p2=i+j+1;
int mulval = (num1[i]-'0')*(num2[j]-'0')+val[p2];
val[p2] = mulval%10;
val[p1] += mulval/10;
}
}
// 去掉前导0 如果都是0 就返回零
for(int &x:val){
if(!ans.empty() || x!=0) ans.push_back(x+'0'); //push_back加入一个char 使用+时加""
}
return ans.empty() ? "0" : ans;
}
int main()
{
cin>>str;
for(int i=0;i<str.size();i++)
{
int n=str[i]-'0';
h[n]++;
}
string d = multiply(str,"2");
for(int i=0;i<d.size();i++)
{
int n=d[i]-'0';
h[n]--;
}
for(int i=0;i<10;i++)
{
if(h[i]<0 || h[i]>0) {
cout<<"No"<<endl;
cout<<d<<endl;
return 0;
}
}
cout<<"Yes"<<endl;
cout<<d<<endl;
system("pause");
}
思路
由于题意最大不超过20位数字,这个位数超过了long long
型,需要使用大数相乘模拟算法计算双倍的数。
同样的,使用哈希表记录每个数字出现的次数,如果哈希表最后归零,就说明是重新排列组合的结果。