蒟蒻求助,有详细注释,没看出哪里错了qwq

P1015 [NOIP1999 普及组] 回文数

daonan @ 2022-01-22 16:26:23

#include<bits/stdc++.h>
#define maxn 201
using namespace std;
int a[maxn],b[maxn],c[maxn];  //a:原数字,b:颠倒后数字,c:加起来
int main()
{   int n;
    string ass;        
    cin>>n;        //输入进制
    cin>>ass;      //输入原字符串
    int len=ass.length();
        for(int i=len-1,j=1;j<=len,i>=0;i--,j++)
        {
         a[j]=ass[i]-'0';
         b[i+1]=ass[i]-'0';  //把原字符串改成int数组表示
        }
        int flag=0;          //用于计数step
        int flags=0;         //用于判断是否形成回文
     int max=40;
     while (max--)          //30次循环
     {
        flag++;             //开始一次操作,step+1
        for(int i=1;i<=len;i++) //c=a+b
        {
            c[i]+=a[i]+b[i];
            c[i+1]=c[i]/n;      //进位
            c[i]%=n;       
        }
        if(c[len+1]) len++;     //最高位进位后总位数+1
        if(len%2)               //位数为奇数时
        {
            for(int i=1,j=len;i<=len/2,j>=(len/2)+2;i++,j--)
            {
                if(c[i]==c[j]) flags++;  //两侧开始判断是否为回文
            }
        }
        else                    //位数为偶数
        {
            for(int i=1,j=len;i<=len/2,j>=(len/2)+1;i++,j--)
            {
                if(c[i]==c[j]) flags++;
            }
        }
        if(flags==len/2)       //如果是回文
        {
            cout<<"STEP="<<flag;
            return 0;
        }
        if(flag>30) break;     //30次后没操作出来
        for(int i=1,j=len;i<=len,j>=1;i++,j--) //用c替换a,颠倒后得到b,供给下次操作
        {
            a[i]=c[i];
            b[j]=c[i];
        }
    }
    cout<<"Impossible!" ;     //没操作出来的结果
    return 0;
}

by manba_out @ 2022-01-23 11:29:46

在第2个for中加个特判。


by daonan @ 2022-01-24 19:48:02

@zhouhongyi 能详细一点嘛qwq,不是很明白您是说哪个qwq


by manba_out @ 2022-01-25 07:43:53

好的,我现在在上课,等下了课给你发我的代码,(我今年12岁,好不?)


|