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;
}