【发布时间】:2023-03-18 05:49:01
【问题描述】:
所以在 Project Euler 中,Problem 4 声明如下:
回文数的读法相同 双向。最大的回文 来自两个 2 位数字的乘积 数字是 9009 = 91 99。
找到最大的回文数 两个 3 位数字的乘积。
我尝试了以下方法:
#include <stdio.h>
#include <stdlib.h>
int check(int result)
{
char b[7];
sprintf(b, "%d", result);
if (b[0] == b[5] && b[1] == b[4] && b[2] == b[3])
{
return 1;
}
else
{
return 0;
}
}
int main () {
int i;
int g;
int final;
for (i = 999; i > 99; i--)
{
for (g = 999; g > 99; g--)
{
if (check(g*i) == 1)
{
final = g*i;
goto here;
}
}
}
here:
printf("%d", final);
}
但是,这不起作用。我得到的不是正确答案,而是 580085,我猜这至少是一个回文,但仍然不是正确答案。
让我从int main开始解释我的程序:
-
int i和int g是我的乘数。它们就是那两个三位数。 -
int final是存储最大回文数的数字。 - 我开始了两个 for 循环,以获取每个数字的可能性。
- 当到达第一个回文时,我使用 goto 退出循环(可能不应该,但它不会对这样的小程序产生太大影响)。
- 第一个回文应该是最大的回文,因为我从顶部倒数。
现在让我解释一下我的支票:
- 首先,因为这是两个三位数相乘以确定一个 char 保持该值所需的大小,所以我用计算器乘以 999 * 999,结果是 6,然后我需要加一个因为我从我之前发布的一个问题中发现
sprintf在末尾添加了一个\0字符。 - 好的,既然我有一个字符,我复制了
result(int main中的i*g)并将其放入char b[7]。 - 然后我检查了
b,通过硬编码我需要检查的每个插槽来查看它是否与它自己相同。 - 然后我相应地返回,1 为真,2 为假。
这对我来说似乎完全合乎逻辑,但是由于某些奇怪的原因它不起作用。有什么提示吗?
【问题讨论】:
-
你的“g”倒计时太快了——你可能会发现一个基于 999 * 101 的回文,但真正的答案更像是 997 * 867,它更大。
-
一个提示:乘法是可交换的,因此您可以使用
for (g = i; g > 99; g--)来避免同时测试999*100和100*999。 -
顺便说一句,这是 goto 的合法用途
-
解决这个问题的另一种方法是从 999*999 迭代到 100*100,然后对每个回文测试看它是否是两个 3 位数字的乘积。
标签: c algorithm palindrome