PAT-A 1024. Palindromic Number (25)

题目连接在此

一道大整数加法+简单模拟题。

大整数运算相关内容,请看这里

题意

定义一种操作:让一个整数加上这个整数转置后的数。(例如123,转置后为321,两数相加123+321=444)
现在给出一个整数以及限制的操作次数,问在限定次数内是否能够得到回文数(上例中的444就是回文数)。如果在限定次数内能得到,输出这个回文数,并输出操作次数;如果在限定的操作次数内不能得到回文数,则输出最后一次操作得到的数字,以及操作次数。(定义一位数为回文数)

思路

我们需要以下几个操作:
1. 大数加法
2. 大数转置
3. 判断一个数是否是回文数

实现了以上函数之后只需对题目所诉操作进行模拟即可。

AC代码

#include<stdio.h>
#include<cstring>
#include<algorithm>

using namespace std;

struct bign{ //big number
    int num[100];
    int len;

    bign(){
        memset(num, 0, sizeof(num));
        len = 0;
    }
}; 

void print(bign a);

void charToInt(char temp[], bign &n){ //将char[]型temp转换成int型 
    for(int i = 0; i < n.len; i++){
        n.num[n.len-i-1] = temp[i]-'0';
    }
}

bool isPalindromic(bign n){ //判断n是不是回文数 
    int i = 0, j = n.len-1;
    for(i,j; i <= j; i++,j--){
        if(n.num[i] != n.num[j]) return false; //不是回文数 
    } 
    return true;  //是回文数 
} 

bign reverse(bign n){  //反转一个数 
    bign temp;
    temp.len = n.len;
    for(int i = 0; i < n.len; i++){
        temp.num[i] = n.num[n.len-1-i];
    }
    return temp; 
} 

bign add(bign a, bign b){  //两个大整数相加求和 

    bign res;
    int carry = 0;
    for(int i = 0; i<a.len || i<b.len; i++){
        carry = carry+a.num[i]+b.num[i];
        res.num[i] = carry%10;
        carry /=10 ;
        res.len++; 
    } 
    res.num[res.len++] = carry;

    //去除前导零
    while(res.len-1 >= 1 && res.num[res.len-1] == 0){
        res.len--;
    }

    return res;
}

void print(bign a){
    for(int i = a.len-1; i >= 0; i--){
        printf("%d",a.num[i]);
    }
    printf("\n");
}

int main(){

    bign n;
    int k;

    char temp[15];
    while(scanf("%c",&temp[n.len])){ //读入n 
        if(temp[n.len] == ' ') break;
        n.len++;
    }
    scanf("%d",&k); //读入K 

    charToInt(temp,n); //将temp转换成int放入n

    int count = 0; //记录操作次数 
    do{      //进行题目所述操作 
        if(isPalindromic(n)){ // 如果n是回文数 
            print(n);
            printf("%d\n",count);  //输出操作次数 
            return 0;
        }else{ //如果n不是回文数,则进行题设操作 
            bign newN = reverse(n); //反转n
            n = add(n, newN);
        } 
        count++;
    }while(count < k);

    print(n);
    printf("%d\n",k);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值