所以在欧拉计划中问题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
and int g
是我的乘数。它们就是那两个三位数。
-
int final
是将存储最大回文数的数字。
- 我开始两个 for 循环,一直向下以获得每个数字的可能性。
- 当到达第一个回文时,我使用 goto 退出循环(可能不应该,但是,它不会对这样的小程序产生太大影响)。
- 第一个回文应该是最大的回文,因为我是从顶部倒数的。
现在让我解释一下我的支票:
- 首先,因为这些是两个三位数相乘来确定 char 需要保持该值的大小,所以我使用计算器并乘以 999 * 999,最终得到 6,然后我需要添加一个,因为我发现从我之前发布的一个问题中得出
sprintf
puts a \0
字符在最后。
- 好的,现在我有了一个字符和所有内容,我复制了
result
(which i*g
in int main
)并将其放入char b[7]
.
- 然后我刚刚检查了
b
通过对我需要检查的每个插槽进行硬编码,看看它是否等于它自己。
- 然后我相应地返回了,1代表true,2代表false。
这对我来说似乎完全合乎逻辑,但是由于某些奇怪的原因它不起作用。有什么提示吗?
这个假设是错误的:
第一个回文应该是最大的回文,因为我是从顶部倒数的。
你会检查999*100 = 99900
before 998*101 = 100798
,很明显你不能指望这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)