回文数的解法
若一个数(首位不为零)从左到右读与从右到左读都是一样,我们就将其称之为回文数。例如:给定一个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");
}
哪错了呢?想不通!!指点一下!!!
----------------解决方案--------------------------------------------------------
有这么难吗?
----------------解决方案--------------------------------------------------------
那你做一下看啊,顺便给我教一下呵呵!!
[此贴子已经被作者于2007-7-10 19:10:59编辑过]
----------------解决方案--------------------------------------------------------
这个是一到ACM题目吧.看过.简单的.对每一个数做数组保存其每一位,看是否回文,若是结束,否则继续做相加.直到出现回文或者是次数到30.
----------------解决方案--------------------------------------------------------
直接用字符串来接收数字可以省掉做数转换操作.最多循环30次,效率上应该可以A.同时也可以不用考虑数据会溢出的可能.
不过这样的话就得做一个字符串的加法的函数.
----------------解决方案--------------------------------------------------------
C高手们,帮小弟弄一下这个题,小弟不会了!!
----------------解决方案--------------------------------------------------------
写一个程序,给定一个N(2<=N<=10,N=16)进制数M,到底N是进制数,还是M?应该这样说明吧?N(2<=N<=10||N=16),N进制数吧?M是给定的被转换数?
----------------解决方案--------------------------------------------------------
N 进制下的数M.
10进制下的数65.
----------------解决方案--------------------------------------------------------
就是给定一10进制数,转换成N进制M,判断是否回文,如不是把M倒置相加,继续判断,直到符合为止.多出三十步就退出打印错误,否则,返回N步数,理解对了吧.
----------------解决方案--------------------------------------------------------
不需要转换成10进制做,可以直接做,可以省事.
----------------解决方案--------------------------------------------------------