C中的回文数字,字符串错误

时间:2017-06-11 10:24:15

标签: c

C的新手。试图编写打印出回文数字的程序<百万。 打印出胡言乱语。我用字符串犯了错误吗?

int decimal_pali(int x)
{
   int digits=0;
   int num=x;
   char D[7];
   while(num>0)
   {
       D[digits]=num%10;
       digits+=1;
       num/=10;
   }

   D[digits]='\0';
   num=atoi(D);

   if(num == x)
   {
      return 1;
   }

  return 0;
}

2 个答案:

答案 0 :(得分:4)

你的错误在于:

D[digits]=num%10;

应该是

D[digits] = num%10 + '0';

num % 10将导致0到9之间的数字,但由于您正在使用字符,因此需要获取数字的ASCII值。如果您查看ASCII table,您会发现为了达到您想要的效果,您需要将'0'(48)的ASCII值添加到该值以获得正确的字符

答案 1 :(得分:0)

好奇心不会让我抵抗“不止一个基地”的事情,尽管我怀疑这个结果有任何(非平凡的)数论理论意义。无论如何,这是代码,并在下面运行一个示例...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( int argc, char *argv[] ) {
  int n1 = ( argc>1? atoi(argv[1]) : 1 ),
      n2 = ( argc>2? atoi(argv[2]) : 999 ),
      b1 = ( argc>3? atoi(argv[3]) : 10 ),
      b2 = ( argc>4? atoi(argv[4]) : 10 );
  int n=n1, b=b1, ispal();
  char *itoa();
  for ( n=n1; n<=n2; n++ ) {
    for ( b=b1; b<=b2; b++ ) if ( !ispal(n,b) ) goto next_n;
    printf("%10d(base10)",n);
    for ( b=b1; b<=b2; b++ ) printf(" = %s(%d)", itoa(n,b),b);
    printf("\n");
    next_n: ; }
  } /* --- end-of-function main() --- */
int  ispal ( int i, int base ) {
  char *itoa(), *a=itoa(i,base);
  int answer=0, k=0,n=strlen(a);
  if ( n > 1 ) {
    for ( k=0; k<n/2; k++ )
      if ( a[k] != a[n-k-1] ) goto end_of_job;
    answer = 1; }
  end_of_job: return ( answer );
  } /* --- end-of-function ispal() --- */
char *itoa ( int i, int base ) {
  static char a[99], digits[99] = /* up to base 65 */
      "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$*";
  int n = 0;
  while ( 1 ) {
    a[n++] = digits[i%base];
    if ( (i/=base) < 1 ) break; }
  a[n] = '\000';
  return ( a );
  } /* --- end-of-function itoa() --- */

我称它为palinum.c,典型的运行给出了......

bash-4.3$ ./palinum 1 9999999 3 4
        10(base10) = 101(3) = 22(4)
       130(base10) = 11211(3) = 2002(4)
     11950(base10) = 121101121(3) = 2322232(4)
    175850(base10) = 22221012222(3) = 222323222(4)
    749470(base10) = 1102002002011(3) = 2312332132(4)
   1181729(base10) = 2020001000202(3) = 10200200201(4)

在基础3和基础4中仅显示1到1百万之间的“回文”数字。我做的其他一些测试在三个连续碱基中没有同时显示回文。但该程序很容易改变为允许任何一组(非连续)基础。 (对于一个不那么简单的编程挑战,一次尝试多个n的多个线程。)