PAT (Advanced Level) Practice A1024 Palindromic Number (25 分)(C++)(甲级)(大数求和、回环数)

题目链接:1024 Palindromic Number

using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include <ctime>
#include <cmath>

typedef struct bign
{
    int d[100];//太小容易溢出
    int len;
} bign;
bign Raw = {0}, Turn = {0};//Raw为原始数据,D为其二倍

bool isPalindromic(bign A)//判断是否回环
{
    for(int i=0, j=A.len-1; i<j; i++, j--)
    {
        if(A.d[i] != A.d[j]) return false;
    }
    return true;
}

bign Reverse(bign A)//翻转
{
    for(int i=0, j=A.len-1; i<j; i++, j--)
        swap(A.d[i], A.d[j]);
    return A;
}

bign ADD(bign A, bign B)//求和
{
    bign C = {0};
    int i, carry = 0, len = max(A.len, B.len);
    for(i=0; i<len; i++)
    {
        C.d[i] = (A.d[i]+B.d[i]+carry)%10;
        if((A.d[i]+B.d[i]+carry)/10) carry = 1;
        else carry = 0;
    }
    if(carry) C.d[i++] = carry;
    C.len = i;
    return C;
}

int main()
{
    int cnt = 0, K;
    char S[30];
    scanf("%s %d", S, &K);
    Raw.len = strlen(S);
    for(int i=0; i<Raw.len; i++) Raw.d[i] = S[Raw.len-1-i] - '0';//让高位存放高位
    while(cnt<K && !isPalindromic(Raw))
    {
        Turn = Reverse(Raw);//翻转
        Raw = ADD(Raw, Turn);//求和
        cnt++;
    }
    for(int i=Raw.len-1; i>=0; i--) printf("%d", Raw.d[i]);//打印输出
    printf("\n%d", cnt);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值