PAT 1136 A Delayed Palindrome

这一题是求一个数是否自身对称, 如121,1221。如果不对称,就将原数反转,然后跟原来的数相加,结果判断是否是对称,不对称则重复上述操作直到找到对称的数,或者次数达到10次。如123, 不是对称的,加上其反转,123+321=444,444是对称的,输出“444 is a palindromic number.”。
注意点:
1、输入数字后要判断原数是否符合条件,符合输出结束。
2、数字最大位数为1000位,要用数组来处理数字的加减
3、虽然输入的位数是1000位以内,相加的结果可能超过1000位(这是最后一个测试点)

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(int d[],int length){
   int i=0,j=length-1;

   while(i<j&&d[i]==d[j]){
   i++;j--;
   }
   if(j<=i){
    return true;
   }
   return false;

}

void printArray(int a[],int length){
   for(int i =0 ;i<length;i++){
    printf("%d",a[i]);
   }
}
int main()
{
    int a[1005];
    int b[1005];
    int c[1005];
    char digch[1005];
    scanf("%s",digch);
    int digLength = strlen(digch);

    int j = digLength;
    for(int i=0;i<digLength;i++){
        a[i] = digch[i] - '0';
        b[--j] = a[i];
    }

    int mod= 0;
    int k=0;
    int orginalLength;
    //原数是否满足条件
     if(isPalindrome(a,digLength)){
            printArray(a,digLength);
            printf(" is a palindromic number.\n");

        }
    else{
    for(k=0;k<10;k++){
        orginalLength=j = digLength;
     for(int i=0;i<digLength;i++){
        b[--j] = a[i];
    }
        //相加
        for(int i= digLength - 1;i >= 0;i--){
            c[i] = (a[i] +b[i] + mod ) % 10;
            mod = (a[i] +b[i] + mod ) / 10;
        }
        //最高位是否有进位
        if(mod > 0){

            for(int i=digLength;i>0;i--)
                c[i]= c[i-1];
            c[0] =mod;
            mod = 0;
            digLength++;
        }
        //输出
        printArray(a,orginalLength);
        printf(" + ");
        printArray(b,orginalLength);
        printf(" = ");
        printArray(c,digLength);
        printf("\n");
        //判断是否满足条件
        if(isPalindrome(c,digLength)){
            printArray(c,digLength);
            printf(" is a palindromic number.\n");
            break;
        }
        for(int i=0;i<digLength;i++){
            a[i] = c[i];
        }

    }

        if(k>=10){
            printf("Not found in 10 iterations.\n");
        }
       }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值