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<cstring>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int main(){
char dig[25]; //以字符串形式输入数字
int dou[25]; // 以int数组形式记录输入数字的2倍
cin.getline(dig,25); //输入数字
int len = strlen(dig);
int ss[12]={0},dd[12]={0}; //输入数字中0~9的个数, 输入数字的2倍的数字中0~9的个数
int i,j,k=0,t=0;
for(i=len-1,j=0;i>=0;i--,j++){
k = dig[i]-'0'; //输入数字的第i位数字
ss[k]++;
k = (k*2+t); //输入数字的第i位数字乘以2再加上进位
t=k/10; //算出下一个进位
k=k%10; //乘以2后当前第j位的数字
dou[j]=k;
dd[k]++;
}
dou[j]=t;
while(t){
dd[t%10]++;
t/=10;
}
for(i=0;i<10;i++){
if(ss[i]!=dd[i]){
break;
}
}
if(i>=10){
cout<<"Yes";
}else{
cout<<"No";
}
cout<<endl;
if(dou[j]!=0){
cout<<dou[j];
}
for(j=j-1;j>=0;j--){
cout<<dou[j];
}
return 0;
}