在Project Euler上,问题4陈述如下:
但是,这并不起作用。我得到的不是正确答案,而是580085,我猜至少是回文,但仍然不是正确答案。
让我从
回文数是指从左到右和从右到左读取都一样的数字。由两个二位数相乘得到的最大回文数是9009 = 91 x 99。
请找出由两个三位数相乘得到的最大回文数。
我尝试了以下方法: #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
是将存储最大回文的数字。- 我开始两个循环,以获得每个数字的可能性。
- 当第一个回文出现时,我使用goto退出循环(可能不应该,但对于这样一个小程序没有太大影响)。
- 第一个回文应该是可能的最大值,因为我从顶部向下计数。
- 首先,由于这是两个三位数相乘,为了确定一个char需要容纳那个值的大小,我去了一个计算器并将999 * 999相乘,结果是6,然后我需要再加上一个,因为我从之前发布的问题中发现sprintf在末尾放置了一个\0字符。
- 好的,现在我有了一个char,我复制了
result
(即int main
中的i*g
),并将其放入char b[7]
中。 - 然后,我只是检查了
b
是否与我需要检查的每个插槽硬编码相等。 - 然后我根据情况返回1表示true,2表示false。
for (g = i; g > 99; g--)
来避免测试999*100
和100*999
两种情况。 - Emilio Silva