Have Fun with Numbers
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 <stdio.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
int bits = 0, i, n[21], dn[21], carry = 0, db;
int ss[10] = { 0,0,0,0,0,0,0,0,0,0 }; //一个数中每个数字出现的次数(下标表示数字,下标对应的数据为该数字出现的次数)
int tt[10] = { 0,0,0,0,0,0,0,0,0,0 }; //该数乘2后每个数字出现的次数
char temp;
temp = getchar();
while (temp >= '0'&&temp <= '9')
{ //输入原始数
n[bits] = temp - '0';
bits++;
temp = getchar();
}
db = bits;
for (i = bits - 1; i >= 0; i--)
{ //模拟乘法
dn[i] = n[i] * 2 % 10;
if (carry == 1) //需要进位
{
dn[i]++;
carry = 0;
}
if (n[i] * 2 >= 10)
{
carry = 1;
}
if (i == 0 && n[i] * 2 >= 10) //最高位需要进位
{
for (int j = bits; j >= 1; j--) //所有数字往后挪一位(腾出最高位)
{
dn[j] = dn[j - 1];
}
dn[0] = 1;//最高位为1
db++;//乘2后的数位数加1
}
}
for (i = 0; i < bits; i++)
{//统计原始数每个数字出现的次数
ss[n[i]]++;
}
for (i = 0; i < db; i++)
{//统计乘2后每个数字出现的次数
tt[dn[i]]++;
}
for (i = 0; i < 10; i++)
{ //判断每个数字出现的次数是否一样
if (ss[i] != tt[i])
{
break;
}
}
if (i < 10 || bits != db)//每个数字出现次数不完全一样 或 乘2后位数与原始数不一样
{
printf("No\n");
int maxbits;
if (bits != db) //判断乘2后的位数
{
maxbits = db;
}
else
{
maxbits = bits;
}
for (i = 0; i < maxbits; i++)
{
printf("%d", dn[i]);
}
}
else
{
printf("Yes\n");
for (i = 0; i < bits; i++)
{
printf("%d", dn[i]);
}
}
return 0;
}