1309:【例1.6】回文数(Noip1999)

今天写代码的时候遇到大整数回文数,本来就有点难,再加上不细心,搞了半天才搞好

//
// Created by L on 2019-12-01.
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

int a[100],b[100],n,count;
//初始化数组a--使用数组进行判断
void init(int a[]){
    int i;
    string s;//将需要验证的数以字符串的形式输入
    memset(a, 0, sizeof(a));//将数组a清零
    cin>>n>>s;
    //将字符数组转换成整数数组
    a[0]=s.length();//用a[0]存储输入数字的大小
    for (i = 1; i <=a[0];i++) {//将字符数组转换成整数数组
        if(s[a[0]-i]>='0'&&s[a[0]-i]<='9'){
            a[i]=s[a[0]-i]-'0';
        }else{
            a[i]=s[a[0]-i]-'A'+10;
        }
    }

}

//判断一个数是否是回文数
int palindrom(int a[]){
    int i;
    for (i = 1; i <= a[0]; i++) {//此处使用i <= a[0]判断,效率比较低
        if(a[i]!=a[a[0]+1-i]){//这地方是加1,不是减1,就是因为这个错误,搞了好长时间,气死我了
            return 0;
        }
    }
    return 1;
}

//将非回文数进行加法运算
void addition(int a[]){
    int i;
    for(i=1;i<=a[0];i++)//将数组a中的数字逆序存入到b中
        b[i]=a[a[0]-i+1];
    for (i = 1; i <=a[0]; i++) {//将两个数字进行加法运算,注意条件中的等号
        a[i]+=b[i];
    }
    for (i = 1; i <=a[0] ; i++) {//将加法得到的数进行n进制合理化
        a[i+1]+=a[i]/n;//注意加号,注意这里除的是n不是10
        a[i]=a[i]%n;
    }
    if(a[a[0]+1]>0) a[0]++;//修正新的a位数
}

//主函数
int main(){
    //初始化a
    init(a);
    //判断是否回文数
    if(palindrom(a)){cout<<0<<endl;return 0;}
    //判断M是否是n进制的回文数字--使用数组的方式
    count=0;
    while (count<=30){
        count++;
        addition(a);
        if(palindrom(a)){cout<<count<<endl;return 0;}//这个地方要打印count
    }
    cout<<"impossible";
    return 0;
}

 

总结:

对于大整数的运算比较好的方法是使用字符数组进行运算,所以这个题目选择用字符数组比较好是实现,同时记住使用数组的第一个来存储数组长度,这一个就类似简单排序里面的“哨兵 ”原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值