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

C中的回文数字,字符串错误,c,C,C语言新手。尝试编写打印回文数D[位数]=“0”+num%10;对于C来说,这只是一个建议:在您按照前面指出的方法修复它之后,将其更改为任意_base_palint x,int base,现在,找出哪个数字(如果有的话)在多个基数中是回文的。当num==0时,如果num>0{…}失败,则使用do{…}while num>0;要确保D[]中至少有1位数字,请执行以下操作:D[digits]=num%10;->D[位数]=“0”+num%10;对于C来说,这只是一个建议:在您按照前面指出的方法修复它

C语言新手。尝试编写打印回文数<100万的程序。 打印出jibberish。我在字符串方面出错了吗

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;
}

你的错误在于:

D[digits]=num%10;
应该是

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

num%10将产生一个介于0和9之间(含0和9)的数字,但由于您使用的是字符,因此需要获取该数字的ASCII值。如果查看,您会发现为了实现所需,需要将ASCII值“0”48添加到该值以获得正确的字符。

您的错误在于:

D[digits]=num%10;
应该是

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

num%10将产生一个介于0和9之间(含0和9)的数字,但由于您使用的是字符,因此需要获取该数字的ASCII值。如果你看一下,你会发现为了实现你想要的,你需要将ASCII值“0”48添加到值中以获得正确的字符。

好奇让我无法抗拒不止一个基本的东西,尽管我怀疑结果是否有任何非平凡的数论意义。无论如何,这是代码,下面是一个运行示例

#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() --- */

只显示了基数为3和基数为4的100万到1000万之间的几个回文数字。我做的其他几个测试没有显示在连续三个碱基中同时出现回文。但是程序很容易改变,允许任何一组非连续的碱基。对于一个不那么琐碎的编程挑战,一次尝试几个n的多个线程。

好奇心不会让我抵制不止一个基本问题,尽管我怀疑结果是否有任何非琐碎的数论意义。无论如何,这是代码,下面是一个运行示例

#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() --- */

只显示了基数为3和基数为4的100万到1000万之间的几个回文数字。我做的其他几个测试没有显示在连续三个碱基中同时出现回文。但是程序很容易改变,允许任何一组非连续的碱基。对于一个不那么琐碎的编程挑战,请尝试一次多个线程执行几个n。

D[digits]=num%10;->D[位数]=“0”+num%10;对于C来说,这只是一个建议:在您按照前面指出的方法修复它之后,将其更改为任意_base_palint x,int base,现在,找出哪个数字(如果有的话)在多个基数中是回文的。当num==0时,如果num>0{…}失败,则使用do{…}while num>0;要确保D[]中至少有1位数字,请执行以下操作:D[digits]=num%10;->D[位数]=“0”+num%10;对于C来说,这只是一个建议:在您按照前面指出的方法修复它之后,将其更改为任意_base_palint x,int base,现在,找出哪个数字(如果有的话)在多个基数中是回文的。当num==0时,如果num>0{…}失败,则使用do{…}while num>0;确保D[]中至少有1位数字