PAT_B_1079 延迟的回文数 (20 分)【测试点4,6】

1000位的正整数,必须用大数据[字符数组]进行计算 

测试点4,6都是用的大数进行计算,尤其是测试点6,数据要大于测试点4

给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0。N 被称为一个回文数,当且仅当对所有 i 有 a​i​​=a​k−i​​。零也被定义为一个回文数。

非回文数也可以通过一系列操作变出回文数。首先将该数字逆转,再将逆转数与该数相加,如果和还不是一个回文数,就重复这个逆转再相加的操作,直到一个回文数出现。如果一个非回文数可以变出回文数,就称这个数为延迟的回文数。(定义翻译自 https://en.wikipedia.org/wiki/Palindromic_number

给定任意一个正整数,本题要求你找到其变出的那个回文数。

输入格式:

输入在一行中给出一个不超过1000位的正整数。

输出格式:

对给定的整数,一行一行输出其变出回文数的过程。每行格式如下

A + B = C

其中 A 是原始的数字,BA 的逆转数,C 是它们的和。A 从输入的整数开始。重复操作直到 C 在 10 步以内变成回文数,这时在一行中输出 C is a palindromic number.;或者如果 10 步都没能得到回文数,最后就在一行中输出 Not found in 10 iterations.

输入样例 1:

97152

输出样例 1:

97152 + 25179 = 122331
122331 + 133221 = 255552
255552 is a palindromic number.

输入样例 2:

196

输出样例 2:

196 + 691 = 887
887 + 788 = 1675
1675 + 5761 = 7436
7436 + 6347 = 13783
13783 + 38731 = 52514
52514 + 41525 = 94039
94039 + 93049 = 187088
187088 + 880781 = 1067869
1067869 + 9687601 = 10755470
10755470 + 07455701 = 18211171
Not found in 10 iterations.
​#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char num[2000],backnum[2000];//如果大小仅设置1000,那么测试点6也通不过,加法会出现进位
    memset(num,0,sizeof(num));
    cin>>num;
    int flag=1,turn=10,emergeFlag=1;
    int len=strlen(num);
    int i=0,j=len-1;
    while(i<j)            //将初始数组逆置
    {
        char ttt=num[i];
        num[i]=num[j];
        num[j]=ttt;
        i++;j--;
    }
    while(turn--)    //只能进行十次轮转
    {
        len=strlen(num);
        i=0,j=len-1,flag=1;
        while(i<j)            //是否符合回文数
        {
            if(num[i]!=num[j])
            {
                flag=0;break;
            }
            i++;j--;
        }
        if(flag)            //符合则退出
        {
            cout<<num<<" is a palindromic number.";
            emergeFlag=0;
            break;
        }
        else                //不符合回文数
        {
            len=strlen(num);
            for(int m=len-1;m>=0;m--)cout<<num[m];    
            cout<<" + ";
            for(int m=0;m<len;m++) cout<<num[m];
            cout<<" = ";
            strcpy(backnum,num);
            int carry=0,sumflag=0,temp;
            int k=len-1;
            int m=len-1-k;
            while(carry||k>-1)        //如果位置达到最后,也没有进位,则加法结束
            {
                if(k>-1) m=len-1-k;
                else backnum[k]=backnum[m]='0';            //如果位置到头,则将两个加数置0
                temp=(backnum[k]-'0')+(backnum[m]-'0')+carry;
                if(temp>=10)
                {
                    carry=temp/10;
                    temp%=10;
                }
                else carry=0;
                //如果位置达到最后,且数为0,则不能输出
                if(!(temp==0&&k==-1))num[sumflag++]='0'+temp;
                if(k>-1)k--;
            }
            for(int m=sumflag-1;m>=0;m--)
                cout<<num[m];
            cout<<endl;

        }
    }
    if(emergeFlag)cout<<"Not found in 10 iterations.";  //过程中并没有出现回文数
    return 0;
}
​

猜你喜欢

转载自blog.csdn.net/id33749110/article/details/86555191