我编写了以下代码来查找由3位数乘积形成的最大回文。嵌套循环存在一个问题,它会导致分段错误。有人能帮我调试吗?
该代码适用于较小的数字,但适用于较大的数字时会出现分段错误(这就是我对k、l、max和a变量使用long int而不是int的原因)。
#include<stdio.h>
long reverse(long);
main()
{
long k, l, max, a[100];
int i, j, t=0;
printf("hellon");
for(i=999; i>99; i--)
{
for(j=999; j>99;j--)
{
// printf("hellon");
k=i*j;
l= reverse(k);
if(k==l) {a[t]=k; t++; }
}
}
printf("hellon");
max=a[0];
for(t=1;t<100; t++)
{
if(max<a[t]) {max=a[t];}
}
printf("Largest palindrome is %ldn", max);
}
long reverse(long n)
{
long rev=0;
while(n!=0)
{
rev= rev*10;
rev= rev+n%10;
n=n/10;
}
return rev;
}
对于较大的数字,t
的大小会超过数组a
的大小。
这将导致程序在不应该写入的程序堆栈上写入,这可能会导致核心转储崩溃。
如果你只想找到最大的回文,你不需要把它们都保存下来。你可以保存最大的一个。
由于a
只有100个元素长,因此需要确保t
始终小于100,否则将溢出数组的边界。您可能希望使用realloc
来使用指针动态分配a
。