#include <stdio.h>
#include <string.h>
int numN[21] = {-1};
int lenN;//全局变量方便用于函数中
int search(int num[],int n);
int main()
{
char N[21];
int numN2[21] = {0};
int flag = 0;
scanf("%s",N);
lenN = strlen(N);
int j = 0;
for(int i=lenN-1;i>=0;i--){ //因为数组下标从0开始,所以-1
numN[j] = N[i] - '0'; //将字符串数字转化为整型存在numN数组中
j++;
}
for(int k=0;k<lenN;k++){
numN2[k] += numN[k] + numN[k];//手动加法,避免大数精度问题
if(numN2[k]>9){
numN2[k+1]++; //进一位
numN2[k] -= 10;
}
}
for(int k=0;k<lenN;k++){
if(search(numN,numN2[k]))
flag++;//当二倍N中的数字在N中时,flag增加,falg一方面确定数字都在,一方面如果进位了直接No
}
if(flag==lenN)
printf("Yes\n");
else
printf("No\n");
for(int i=lenN;i>=0;i--){
if(numN2[lenN]!=0&&i==lenN)//如果最高位进位了,输出这一位
printf("%d",numN2[i]);
if(i!=lenN)
printf("%d",numN2[i]);//与N位数相同部分直接输出
}
return 0;
}
int search(int num[],int n)//找相同函数
{
int eye = 0;
for(int j=0;j<lenN;j++){
if(num[j]==n){
num[j] = -1;//找到一次后即赋值-1,避免下次重复找
eye = 1;
break;
}
}
if(eye)
return 1;
else
return 0;
}
这次采用了数组来实现大数加法,成功通过;代码及注释如上
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.