回文数的解法
若一个数(首位不为零)从左到右读与从右到左读都是一样,我们就将其称之为回文数。例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个会文数。又如,对于10进制数87:STEP1:87+78=165 STEP2:165+561=726
STEP3:726+627=1353 STEP4:1353+3531=4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10,N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出"Impossible!"
样例:
INPUT
N=9 M=87
OUTPUT
STEP=6
#include "stdio.h"
#include "string.h"
long qiuhe(int n,long a,long b)
{
long t=0;
if (n==10)return a+b;
while(a||b)
{
if(a%10+b%10>=n)t+=(a%10+b%10)/n;
t=t*10+((a%10+b%10)%n);
a/=10;
b/=10;
}
a=t;
t=0;
while(a)
{
if(a%10>=n)t+=a/n;
t=t*10+a%10%n;
a/=10;
}
return t;
}
long qufan(long m)
{
long n=0;
while(m)
{
n=n*10+m%10;
m=m/10;
}
return n;
}
long huiwen(long n,long m)
{
long a=m,b,i=0;
l: i++;
b=qufan(m);
m=qiuhe(n,a,b);
if (m==qufan(m))return i;
a=m;
goto l;
}
dongrunlai(int n,long m)
{
while(m)
{
if(m%10>=n)return 0;
m=m/10;
}
return 1;
}
void main()
{
long m;
int n;
printf("please into bit (2-10):");
scanf("%d",&n);
printf("please into one number ");
printf("%d",n);
printf("bite number :");
scanf("%d",&m);
if(donrunlai(n,m))
{printf("xu yao de ci su :");
printf("%d\n",huiwen(n,m)-2);}
else printf("err into number!\n");
}
哪错了呢?想不通!!指点一下!!!