请教回文数的算法?

时间:2022-07-09 10:57:45
小弟最近遇到一难题,希望大家帮我这初学者解决:前后读起来一样的数叫回文数,(例如12321,156651),一个数加上它的倒置数(例如12+21,126+621)称为一次运算。由德国小学生发现几乎所有的自然数经过若干次运算都能得到回文数,但是有一个似乎例外,这个数在200以内。小弟想在计算机可行的范围内找到它。但是苦于一次运算的算法,各位大侠帮个忙。

11 个解决方案

#1


你定义一个STACK和队列呀。就OK了。呵呵/你去看看“数据结构” ,上面有专门的,回文算法的。。

#2


"若干次运算都能得到回文数"这个例外的数应该运算多少次才能判定是例外的呢?

#3


UP

#4


呵呵,做课后作业啊~

#5


这是一段回文的代码,看看。见笑了。


#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"

int n,l;

void main(void)
{
   void char2int(char*,int*);
   int check(int*);
   void add(int*);

   char s[20];
   int  m[100];
   int i=0,flag=0;

   printf("\nplease input the string:");
   scanf("%s",s);
   printf("\nplease input the carry of string:");
   scanf("%d",&n);

   l=strlen(s);


   char2int(s,m);

   while(flag==0&&++i<30)
    if(check(m)) flag=1;
     else add(m);

   if(flag) printf("\nthe step is %d\n",i-1);
    else printf("\nis not a palindrome!\n");

   system("pause");

  }

  void char2int(char *s,int *m)
  { int i;
     for(i=0;i<l;i++)
      if(isdigit(s[i])) m[i]=s[i]-48;
       else m[i]=s[i]-97+10;

    }

  int check(int *m)
  { int i;

    for(i=0;i<(l/2);i++)
     if(m[i]!=m[l-1-i]) return(0);
    printf("\n");
    for(i=0;i<l;i++)
     if(m[i]<10)
printf("%d",m[i]);
     else printf("%c",m[i]-10+97);
    return(1);
    }

  void add(int *m)
  {   int i;
      int t1[100],t2[100];
      t1[0]=t2[0]=0;
      for(i=0;i<l;i++) {t1[i+1]=m[i];t2[i+1]=m[l-1-i];}
      for(i=l;i>0;i--){
       t2[i]+=t1[i];
       t2[i-1]=t2[i]/n+t2[i-1];
       t2[i]%=n;
   }
       if(t2[0]!=0)
 {for(i=0;i<=l;i++) m[i]=t2[i];l++;}
       else for(i=1;i<=l;i++) m[i-1]=t2[i];

    }

#6


js(int n)
{
  int i,k,strl,half;
  char yy[20];
  itoa(n,yy,10);
  strl=strlen(yy);
  half=strl/2;
  for(i=0;i<half;i++)
  {
    if(yy[i]!=yy[strl-1])
    {return 0;break;}
    else 
    k=1;
  }  
  if(k==1)
  return 1;
}

#7


/*不好意思,写错一处*/
js(int n)
{
  int i,k,strl,half;
  char yy[20];
  itoa(n,yy,10);
  strl=strlen(yy);
  half=strl/2;
  for(i=0;i<half;i++)
  {
    if(yy[i]!=yy[--strl])
    {return 0;break;}
    else 
    k=1;
  }  
  if(k==1)
  return 1;
}

#8


194 196 ?

#9


100000次以上

#10


我这里给一段,求回文的算法
int turn(int a)
{
int i=0,n=0,e=0,f;
f=a;
while(a>=10)
{
a=a/10;
n++;
}
for(i=0;i<=n;i++)
e=e+int(f/pow(10,i))%10*pow(10,n-i);
return e;
}

#11


几天没有回来,想不到有人光临汉舍,还带来了可口的“答案”,小弟不甚感激。
不过,一楼的兄弟,我现在还没有时间看数据库,下次有机会和你好好切磋切磋。
小照 menghun(php)还有小鱼儿,你们的回复先记在心上。(结贴时候保证散分)
这些程序今天晚上好好分析分析,看来,今天晚上又要夜战了。

#1


你定义一个STACK和队列呀。就OK了。呵呵/你去看看“数据结构” ,上面有专门的,回文算法的。。

#2


"若干次运算都能得到回文数"这个例外的数应该运算多少次才能判定是例外的呢?

#3


UP

#4


呵呵,做课后作业啊~

#5


这是一段回文的代码,看看。见笑了。


#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"

int n,l;

void main(void)
{
   void char2int(char*,int*);
   int check(int*);
   void add(int*);

   char s[20];
   int  m[100];
   int i=0,flag=0;

   printf("\nplease input the string:");
   scanf("%s",s);
   printf("\nplease input the carry of string:");
   scanf("%d",&n);

   l=strlen(s);


   char2int(s,m);

   while(flag==0&&++i<30)
    if(check(m)) flag=1;
     else add(m);

   if(flag) printf("\nthe step is %d\n",i-1);
    else printf("\nis not a palindrome!\n");

   system("pause");

  }

  void char2int(char *s,int *m)
  { int i;
     for(i=0;i<l;i++)
      if(isdigit(s[i])) m[i]=s[i]-48;
       else m[i]=s[i]-97+10;

    }

  int check(int *m)
  { int i;

    for(i=0;i<(l/2);i++)
     if(m[i]!=m[l-1-i]) return(0);
    printf("\n");
    for(i=0;i<l;i++)
     if(m[i]<10)
printf("%d",m[i]);
     else printf("%c",m[i]-10+97);
    return(1);
    }

  void add(int *m)
  {   int i;
      int t1[100],t2[100];
      t1[0]=t2[0]=0;
      for(i=0;i<l;i++) {t1[i+1]=m[i];t2[i+1]=m[l-1-i];}
      for(i=l;i>0;i--){
       t2[i]+=t1[i];
       t2[i-1]=t2[i]/n+t2[i-1];
       t2[i]%=n;
   }
       if(t2[0]!=0)
 {for(i=0;i<=l;i++) m[i]=t2[i];l++;}
       else for(i=1;i<=l;i++) m[i-1]=t2[i];

    }

#6


js(int n)
{
  int i,k,strl,half;
  char yy[20];
  itoa(n,yy,10);
  strl=strlen(yy);
  half=strl/2;
  for(i=0;i<half;i++)
  {
    if(yy[i]!=yy[strl-1])
    {return 0;break;}
    else 
    k=1;
  }  
  if(k==1)
  return 1;
}

#7


/*不好意思,写错一处*/
js(int n)
{
  int i,k,strl,half;
  char yy[20];
  itoa(n,yy,10);
  strl=strlen(yy);
  half=strl/2;
  for(i=0;i<half;i++)
  {
    if(yy[i]!=yy[--strl])
    {return 0;break;}
    else 
    k=1;
  }  
  if(k==1)
  return 1;
}

#8


194 196 ?

#9


100000次以上

#10


我这里给一段,求回文的算法
int turn(int a)
{
int i=0,n=0,e=0,f;
f=a;
while(a>=10)
{
a=a/10;
n++;
}
for(i=0;i<=n;i++)
e=e+int(f/pow(10,i))%10*pow(10,n-i);
return e;
}

#11


几天没有回来,想不到有人光临汉舍,还带来了可口的“答案”,小弟不甚感激。
不过,一楼的兄弟,我现在还没有时间看数据库,下次有机会和你好好切磋切磋。
小照 menghun(php)还有小鱼儿,你们的回复先记在心上。(结贴时候保证散分)
这些程序今天晚上好好分析分析,看来,今天晚上又要夜战了。