PAT A1024 Palindromic Number (25point(s))

题目链接
注意点:如果操作步骤上限是100,操作100次以后早就超出long long的表示范围,因此必须使用大整数的结构体。

#include<cstdio>
#include<cstring>
struct bign{//大整数结构体
    int d[1000],len;
    bign(){
        memset(d,0,sizeof(d));
        len=0;
    }
};
bign change(char str[]){
    //将以字符串形式输入的大整数转化为bign类型
    bign res;
    res.len=strlen(str);
    for(int i=0;i<res.len;i++){
        res.d[i]=str[res.len-1-i]-'0';
    }
    return res;
}
bign add(bign a,bign b){//大整数相加
    bign c;
    int carry=0;//进位
    for(int i=0;i<a.len||i<b.len;i++){
        c.d[c.len++]=(a.d[i]+b.d[i]+carry)%10;
        carry=(a.d[i]+b.d[i]+carry)/10;
    }
    if(carry) c.d[c.len++]=carry;//最高位进位
    return c;
}
bign reverse(bign a){//反转
    for(int i=0;i<a.len/2;i++){
        //注意i的上限不能超过总长度的一半,否则中间的元素反转两次等于不变
        int t=a.d[i];
        a.d[i]=a.d[a.len-1-i];
        a.d[a.len-1-i]=t;
    }
    return a;
}
void prit(bign a){//输出大整数
    for(int i=a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}
bool judge(bign a){//判断是否回文
    for(int i=0;i<a.len/2;i++){
        if(a.d[i]!=a.d[a.len-1-i]) return false;
    }
    return true;
}
int main(){
    char n[1000];
    int i,k;
    scanf("%s %d",n,&k);//输入题目给的参数
    bign num=change(n);
    for(i=0;i<k;i++){
        if(judge(num)) {//如果回文
            prit(num);
            printf("\n%d",i);//输出当前的步骤数
            return 0;
        }
        else{//否则反转后相加
            bign num1=reverse(num);
            num=add(num,num1);
        }
    }
    if(i==k){//到达操作步骤上限
       prit(num);
       printf("\n%d",k);
    }
    return 0;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 651

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105567871