【题目大意】
给一个不超过20位的数字,如果将它乘以2得到的数仅仅是原来的数字重新排列得到的,那就输出Yes,下一行输出加倍后的数。如果不是,输出No,下一行输出加倍后的数。
【思路】
20位过于庞大,超出了long long,所以用数组来做,其中的算法核心有竖式乘法的数组计算法。
【tips】
1 判断原数和double原数是否拥有同样数字的方法:
建立一个数组check[0~9],如果原数的第i位是a,则check[a]++;如果double原数的第i位是a,则check[a]--。最后检查check[0~9],只要有一个不为0,则输出No。
2 读入一个字符(包含空格),用char c = getchar();
【AC代码】
1 #include<iostream> 2 #include <algorithm> 3 using namespace std; 4 int main() 5 { 6 int num[22]; 7 int digit = 0; 8 char c; 9 while (1) 10 { 11 c = getchar(); 12 if (c == ' ')break; 13 num[digit] = c - '0'; 14 digit++; 15 } 16 bool jinwei = 0;//进位标志 17 int i; 18 int dnum[22]; 19 for (i = digit - 1; i >= 0; i--) 20 { 21 dnum[i] = 2 * num[i] + jinwei; 22 if (dnum[i] >= 10) 23 { 24 dnum[i] -= 10; 25 jinwei = 1; 26 } 27 else jinwei = 0; 28 } 29 if (jinwei == 1) 30 { 31 cout << "No" << endl; 32 cout << 1;//输出进位 33 } 34 else 35 { 36 int check[10] = { 0 }; 37 for (i = 0; i < digit; i++) 38 { 39 check[num[i]]++; 40 check[dnum[i]]--; 41 } 42 for (i = 0; i < 10; i++) 43 if (check[i] != 0) 44 break; 45 if (i == 10)cout << "Yes" << endl; 46 else cout << "No" << endl; 47 } 48 for (i = 0; i < digit; i++) 49 cout << dnum[i]; 50 return 0; 51 }