• [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 }
  • 相关阅读:
    windows下Qt5.1.0配置android环境搭建 good
    Qt Focus事件,FocusInEvent()与FocusOutEvent()
    Python框架之Django
    WITH (NOLOCK)浅析
    区域、模板页与WebAPI初步
    对象映射工具AutoMapper介绍
    .NET大型B2C开源项目nopcommerce解析——项目结构
    企业管理系统集成
    oracle中sql语句的优化
    C#可扩展编程之MEF
  • 原文地址:https://www.cnblogs.com/yue36/p/12382133.html
Copyright © 2020-2023  润新知