PAT (Advanced Level) 1023. Have Fun with Numbers (20) 字符串翻倍,哈希

来源:互联网 发布:php在北京好找工作吗 编辑:程序博客网 时间:2024/06/06 20:52

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 file 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:
Yes2469135798
字符串处理。使用一个数组a[10]作哈希表判断是否匹配。
/*2015.7.22cyq*/#include <iostream>#include <vector>#include <string>using namespace std;string doubleString(const string &s1){string s2(s1);int carry=0;int tmp;for(auto it=s2.rbegin();it!=s2.rend();it++){tmp=(*it-'0')*2+carry;carry=tmp/10;*it=tmp%10+'0';}if(carry>0)s2.insert(s2.begin(),1,carry+'0');return s2;}int main(){string s1;cin>>s1;string s2=doubleString(s1);vector<int> a(10,0);int n1=s1.size();int n2=s2.size();if(n2>n1)cout<<"No"<<endl;else{bool match=true;for(int i=0;i<n1;i++){a[s1[i]-'0']++;}for(int i=0;i<n2;i++){if(--a[s2[i]-'0']<0){match=false;break;}}if(match)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}cout<<s2<<endl;return 0;}


0 0