[NOIP1999]回文数

看了视频发现这个老师讲的思路好清晰

 

用函数一个一个做真的很清晰。

#include <bits/stdc++.h>
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
int n, slong, ans;//最终的次数
int q[1000], w[1000];
string s;
void add(int a[], int b[])//高精度相加
{
    for (int i = 1; i <= slong; i++)
    {
        a[i] += b[i];
        a[i + 1] += a[i] / n;
        a[i] %= n;
    }
    if (a[slong + 1] > 0)
        slong++;
}
void turn(int a[])
{
    int j = 0;
    for (int i = slong; i >= 1; i--)
    {
        w[++j] = a[i];
    }
}
bool hw(int a[])
{
    int ln = slong;
    int i = 1;
    int j = slong;
    while (ln--)
    {
        if (ln < (slong / 2))
            break;
        if (a[i] != a[j])
            return false;
        i++;
        j--;
    }
    return true;
}
void init()
{
    int j = 0;
    for (int i = slong - 1; i >= 0; i--) //因为算加减法的时候是从后往前,所以提前处理
    {
        if (isdigit(s[i]))
            q[++j] = s[i] - '0'; // q[1]=s[slong()] 末尾的数
        else
            q[++j] = s[i] - 'A' + 10;
    }
}
int main()
{

    cin >> n >> s;
    slong = s.size();//将输入字符的长度定义
    init();        //首先对字符进行一个处理,因为0<= n <=10 || n==16 所以是专门对n==16进行的一个处理
    while (!hw(q)) //如果不是回文数就进行操作
    {
        turn(q);   //如果不是回文数列,就进行反转
        add(q, w); //把反转的跟没反转的相加; 高精度相加
        ans++;     //判断次数
        if (ans > 30)
            break;
    }
    if (ans > 30)
        cout << "Impossible!" << endl;
    else
        cout << "STEP=" << ans << endl;
    system("pause");
}

 py自带高精度,真不错呀

def f(s,k):
    mu_ban="0123456789ABCDEF";a=""
    while s>0:#注意这里是大于0
        yu_shu=s%k
        s=s//k
        a+=mu_ban[yu_shu]
    return a[::-1]
n=int(input())
m=input();ans=0
while ans<30 and (m!=m[::-1]):
    m=f(int(m,n)+int(m[::-1],n),n)
    ans+=1
if ans>=30:
    print("Impossible!")
else:
    print(f'STEP={ans}')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值