[PAT] A1024 Palindromic Number

【题目大意】

给一个数字N,使其与自身的逆序数相加,问能否在K次内,得到一个回文数(Palindromic Number)。

【思路】

用string、数组相加即可。

【坑】

如果N就是回文数,则输出次数是0次。

【tips】

翻转两个数可以用reverse函数。这里可以只用string,不用数组,简少代码量。

 

        string s=a;
        reverse(s.begin(),s.end());

 

一开始需要判断N本身是否为回文数,则判断回文数的操作应该放在循环一进去的时候;又由于数字本身与翻转后的结果相等即“回文”,因此直接用翻转后的结果与本身比较,如果相等就退出循环,否则直接二者相加即可。

【AC代码】

1 用string+数组解决,较为繁琐。

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
#define N 10000
int main()
{
    string input;
    cin >> input;
    int times;
    cin >> times;
    if (times == 0)
    {
        cout << input << endl;
        cout << 0;
        return 0;
    }
    int i, k;
    int num[N], dnum[N];
    int digit = input.size();
    for (i = 0; i < digit; i++)
    {
        num[i] = input[i] - '0';
        dnum[digit - i - 1] = num[i];
    }
    int ans[N];
    for (k = 0; k < times; k++)
    {
        bool jinwei = 0;//进位标志
        for (i = 0; i < digit / 2; i++)
            if (num[i] != num[digit - i - 1])
                break;
        if (i == digit / 2)
            break;
        for (i = 0; i < digit; i++)
        {
            ans[i] = num[i] + dnum[i] + jinwei;
            if (ans[i] >= 10)
            {
                ans[i] -= 10;
                jinwei = 1;
            }
            else jinwei = 0;
        }
        if (jinwei == 1)
        {
            ans[digit] = 1;
            digit++;
        }
        for (i = 0; i < digit; i++)
        {
            dnum[i] = ans[i];
            num[digit - i - 1] = dnum[i];
        }
    }
    for (i = digit - 1; i >= 0; i--)
        cout << dnum[i];
    cout << endl;
    if (k < times)cout << k;
    else cout << times;
    return 0;
}
View Code

 

2 简化:用string,翻转用reserve函数。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5 string add(string a, string b) 
 6 {
 7     int tmp = 0;//进位标志
 8     string c = a;
 9     for (int i = b.length() - 1; i >= 0; i--) 
10     {
11         c[i] = (a[i] - '0' + b[i] - '0' + tmp) % 10 + '0';
12         if ((a[i] - '0' + b[i] - '0' + tmp) < 10)
13             tmp = 0;
14         else
15             tmp = 1;
16     }
17     if (tmp == 1)
18         c = '1' + c;
19     return c;
20 }
21 int main()
22 {
23     string a;
24     int k;
25     cin >> a >> k;
26     int c;//c保存迭代的次数
27     for (c = 0; c < k; c++) {
28         string s = a;
29         reverse(s.begin(), s.end());
30         if (a == s)//判断是否是回文数
31             break;
32         a = add(a, s);
33     }
34     cout << a << endl << c << endl;
35     return 0;
36 }

 

posted @ 2020-02-29 11:49  \0.0/  阅读(237)  评论(0编辑  收藏  举报