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岁,好不?)