由两个 3 位数字的乘积制成的最大回文. 使用 c .我的代码中出了什么问题?



程序不起作用,没有给出输出,我不知道该怎么办,问题出在哪里。

我试图找出由两个 3 位数字的乘积制成的最大的回文。

#include <stdio.h>
main() {
int i, k, j, x;
long int a[1000000], palindrome[1000000], great, sum = 0;
// for multiples of two 3 digit numbers
for (k = 0, i = 100; i < 1000; i++) {
for (j = 100; j < 1000; j++) {
a[k] = i * j; // multiples output
k++;
}
}
for (i = 0, x = 0; i < 1000000; i++) {
// for reverse considered as sum
for (; a[i] != 0;) {
sum = sum * 10 + a[i] % 10;
}
// for numbers which are palindromes 
if (sum == a[i]) {
palindrome[x] = a[i];
x++;
break;
}
}
// comparison of palindrome number for which one is greatest
great = palindrome[0];
for (k = 0; k < 1000000; k++) {
if (great < palindrome[k]) {
great = palindrome[k];
}
}
printf("ngreatest palindrome of 3 digit multiple is : ", great);
}

"不工作"是什么意思?

从我的角度来看,有两件事:

1(long int a[1000000], palindrome[1000000]

根据编译配置,编译代码时可能会遇到问题。 数组可能太大,无法容纳在程序的堆栈地址空间中。 在 C 或 C++ 中,本地对象通常在堆栈上分配。不要在堆栈上本地分配它,而是使用其他地方。这可以通过使对象全局化或在全局堆上分配对象来实现。

#include <stdio.h>
long int a[1000000], palindrome[1000000], great, sum = 0;
main() {
int i, k, j, x;

2(printf("ngreatest palindrome of 3 digit multiple is : ", great);

我将通过以下方式更改它:

printf("ngreatest palindrome of 3 digit multiple is %li: ", great);

问候。

在在线编译器上编译和运行代码 我得到了这个:

prog.c:3:1:警告:缺少类型说明符,默认为"int" [-Wimplicit-int] 主(( { ^ prog.c:34:61: 警告:格式字符串 [-Wformat-extra-args] 不使用数据参数 printf("3 位倍数的最大回文是 : ", 很棒(;  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^ 生成 2 个警告。 杀死

了这两个警告都应该考虑在内,但我想指出最后一行。该程序运行时间长,因此该过程被终止。

强烈建议更改算法,或者至少修复检查数字是否为回文的部分:

for (; a[i] != 0;) {            // <--   If a[i] is not 0, this will never end
sum = sum * 10 + a[i] % 10; 
}

我会使用这样的函数

bool is_palindrome(long x)
{
long rev = 0;
for (long i = x; i; i /= 10)
{
rev *= 10;
rev += i % 10;
}
return x == rev;
}

此外,我们不需要任何数组,我们可以使用两个嵌套的for循环计算两个 3 位数字之间的所有可能乘积,并检查它们是否是回文。

最高数字开始,我们可以存储乘积,但前提是它是一个回文并且比以前发现的任何回文都大,并在候选值小于存储的最大值时立即停止内循环的迭代。这将为我们节省大量迭代。

实现这个算法,我发现了最大值906609。

相关内容

  • 没有找到相关文章

最新更新