题目 1161: 回文数(二)
输入:
共两行
第一行为进制数N(2<=N<=16)
第二行为N进制数M(0<=M<=maxlongint)
输出:
共一行,为“STEP=经过的步数”或“Impossible!”
思路:1.进制转换。2.模块化处理 3.三个子程序-将输入数字和逆序加和并
进制处理---将数字按正序和逆序进行排序储存数组---将两个数组对比,
相同则STEP加1
nt add(int x,int y) //加和的进制转换
{
int a[1000];
int b[1000];
int i,j,k;
int zhuan,zhuan1,sum,sumadd,sum1,place,sumadd1;
zhuan=x;
sum=0; sumadd=0; sum1=0; place=0; sumadd1=0;
while(zhuan!=0) //输入数字的位数
{
zhuan=zhuan/10;
sum+=1;
}
zhuan1=x;
for(i=sum-1;i>=0;i--) //将位数输入数组
{
a[i]=zhuan1%10;
zhuan1=(zhuan1-zhuan1%10)/10;
}
for(i=0;i<sum;i++)
{
sum1+=a[i]*pow(10,i);
}
sumadd=sum1+x;
while(sumadd>0)
{
b[place]=sumadd%y;
sumadd=sumadd/y;
place+=1;
}
for(i=0;i<place;i++)
{
sumadd1+=b[i]*pow(10,i);
}
//进制转换
return sumadd1;
}
第一二
int place_z(int x) //正向储存
{
int a[100];
int place=0;
while(x>0)
{
a[place]=x%10;
x=x/10;
place++;
}
return a[100];
}
int place_f(int x) //反向储存
{
int b[100];
int place=0,i;
int y=x;
while(y>0)
{
y=y/10;
place++;
}
for(i=place-1;i>=0;i--)
{
b[i]=x%10;
x=x/10;
}
return b[100];
}
int lenght(int x)
{
int place;
while(x>0)
{
x=x/10;
place++;
}
return place;
}
<--------------------------------三--------------------------------------------->
int contrast(int x,int y)
{
int a[100];
int b[100];
int place,i;
int ww=0;
a[100]=place_z(x);
b[100]=place_f(x);
place=lenght(x);
for(i=0;i<place;i++)
{
if(a[i]!=b[i])
{
x=add(x,y);
a[100]=place_z(x);
b[100]=place_f(x);
ww+=1;
}
else
break;
}
printf("%d",ww);
return 0;