所以在Project Euler上,问题4陈述如下:
回文数字两种方式相同.由两个2位数字的乘积制成的最大回文是9009 = 91 99.
找到由两个3位数字的乘积制成的最大回文.
我尝试过以下方法:
#include#include 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
角色放在最后.
好的,现在我有了一个char和all,我复制了result
(i*g
in in int main
)并把它放入char b[7]
.
然后我只是b
通过硬编码我需要检查的每个插槽来检查它是否与自己相等.
然后我相应地返回,1为真,2为假.
这对我来说似乎是完全合乎逻辑的,但是,它并不适用于一些奇怪的原因.任何提示?
这个假设是错误的:
第一回文应该是最重要的回归,因为我从顶部开始倒计时.
你999*100 = 99900
之前会检查998*101 = 100798
,所以很明显你不能指望它.