[PAT] A1023 Have Fun with Numbers

【题目大意】

给一个不超过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 == '\n')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 }

 

posted @ 2020-02-28 16:53  \0.0/  阅读(122)  评论(0编辑  收藏  举报