找到下一个最小的回文,无限循环
问题描述:
我正在编写代码来找到下一个最小的回文(整数)。我是(必须)使用数组来处理如下所示的过大数字:找到下一个最小的回文,无限循环
#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 .. 请告诉我我错在哪里。
答
不难认识到回文:
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
。
与问题无关,但1)您忘记释放'malloc'ed内存2)为什么您将'max'作为参数传递给'int_convert'? 3)'n'未使用4)'main'的推荐签名是'int main(void)'。 –
'k = max; while(a [k] == 9)' - 'a [k]'在数组后面访问无效内存位置*。也许你需要'k = max - 1; while(a [k] == 9)'? –
设置k = max-1修改数组,但仍然无限循环。再次检查逻辑 –