33,311
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
int judge(int *p,int bit);
int main()
{
int n;
scanf("%d\n",&n);
char ch;
int i=0,j,carry=0;//计数器i,j和余数carry
int a[200],b[200];
while((ch=getchar())!='\n')
{
if (ch>='0'&&ch<='9') a[i++]=ch-'0';
else a[i++]=ch-'A'+10;
}//循环结束后a[i-1]即为最后一个数
for(j=0;j<=i-1;++j)
b[j]=a[i-j-1];//将a颠倒
if(judge(a,i))//如果输入回文数,那么输出步数为0.
printf("STEP=0\n");
else
{
int c[200],bit=i,ans=0; //有i位,但是,注意数组首位是[0];
while(1)
{
for(j=0;;j++)
{
c[j]=(a[j]+b[j]+carry)%n;
if(a[j]+b[j]+carry>=n)//判断是否有进位
carry=1;
else
carry=0;
if(j==bit-1)//如果到了最后一位
{
if(carry==1)
{
bit+=1;//位数加1;
c[bit-1]=1;//首位进1
carry=0;//余数清零
}
break;
}
}
++ans;//步数加1
if(judge(c,bit))//判断是否是回文数
{
printf("STEP=%d\n",ans);
return 0;
}
if(ans>30)//如果步数大于30
{
printf("Impossible!\n");
return 0;
}
for(j=0;j<=bit-1;j++)//重定义abc
{
a[j]=c[j];
b[bit-j-1]=c[j];
}
}
}
return 0;
}
int judge(int *p,int bit)//判断是否是回文数
{
int i;
for(i=0;i<=bit-1;i++)
{
if(p[i]!=p[bit-1-i])
return 0;
}
return 1;
}
if(judge(c,bit) && ans<=30 )//判断是否是回文数