2015-07-11 44 views
-2

我正在编写代码来找到下一个最小的回文(整数)。我是(必须)使用数组来处理如下所示的过大数字:找到下一个最小的回文,无限循环

#include<stdio.h> 
#include<malloc.h> 
#include<string.h> 
void check_pal(int a[],int max) 
{ 
    int i,j,ctr,k; 
    while(1) 
    { 
    for(i=0;i<max;i++) 
    printf("%d",a[i]); 
     ctr=0; 
     k=max-1; 
    while(a[k]==9) 
    { 
     a[k--]=0;//add corner case when k==0 

    } 
    a[k]++; 
    for(i=0,j=max;i<max/2;i++,j--) 
     { 
      printf("%d",i); 
     if(a[i]!=a[j]) 
      { 
       ctr=1; 
       break; 
      } 
     } 
    if(ctr==0) 
    for(i=0;i<max;i++) 
    { 
     printf("%d",a[i]); 
     if(i==max-1) 
      return; 
    } 
    } 
} 
void int_convert(char * m,int a[]) 
{ 

    int i,max; 
    for(i=0;i<strlen(m);i++) 
    { 
     // printf("%c",m[i]); 
     a[i]=m[i]-'0'; 
    } 

    max=strlen(m); 
    printf("%d\n",max); 
    check_pal(a,max); 

} 
void main() 
{ int a[200],max; 
    char * m=malloc(sizeof(char)*200); 
    scanf("%s",m); 
    int_convert(m,a); 
    getch(); 
} 

输出结果是无限循环。 例如对于输入45,输出必须是55,但是会导致0000000 .. 请告诉我我错在哪里。

+0

与问题无关,但1)您忘记释放'malloc'ed内存2)为什么您将'max'作为参数传递给'int_convert'? 3)'n'未使用4)'main'的推荐签名是'int main(void)'。 –

+0

'k = max; while(a [k] == 9)' - 'a [k]'在数组后面访问无效内存位置*。也许你需要'k = max - 1; while(a [k] == 9)'? –

+0

设置k = max-1修改数组,但仍然无限循环。再次检查逻辑 –

回答

0

不难认识到回文:

int is_palindrome(int a[], int max) { 
    for (int i = 0; i < max/2; i++) { 
     if (a[i] != a[max-i-1]) { 
      return 0; 
     } 
    } 
    return 1; 
} 

不难递增值:

void next_value(int a[], int max) { 
    int i = max - 1; 
    a[i]++; 
    while (i > 0 && a[i] > 9) { 
     a[i] = 0; 
     a[i-1]++; 
     i--; 
    } 
} 

可以很容易地显示该值:

void show(int a[], int max) { 
    for (int i = 0; i < max; i++) { 
     printf("%d", a[i]); 
    } 
    printf("\n"); 
} 

随着这种支持很容易找到最小的回文:

void check_pal(int a[], int max) { 
    while (!is_palindrome(a, max)) { 
     next_value(a, max); 
    } 
    show(a, max); 
} 

顺便说一句,我会打电话功能find_pal而不是check_pal