【问题标题】:Largest palindrome product of two 3 digit numbers两个 3 位数字的最大回文乘积
【发布时间】:2015-06-28 18:36:05
【问题描述】:

它可能已经发布在某个地方,因为它是一个项目欧拉问题,但是,我没有解决特定问题的问题,尽管我写的代码确实有问题,因为我似乎无法找错。

我的猜测是我在打印或记忆值时监督某些东西,但我不确定。无论如何,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
int x = 999, y = 999, z = 0, w = 0, a=0, *largest = a;
for (x; x > 99; x--){
    for (y; y > 99; y--){
        z = x*y;
        while (z != 0){
            w = w * 10;
            w = w + z % 10;
            z = z/10;
        }
        if (x*y == w){
            a = w;
            goto stop;
        }
        w = 0;
    }
}
stop: printf("%d\n", largest);
system("pause");
return 0;
}

我知道 a 和最大的东西不是必需的,我只是测试了很多改变所有类型的东西,使用指针等等,所以不需要过多关注代码的那部分.

【问题讨论】:

  • 在创建z 的反向值之前设置w = 0; 是最干净的,而不是在循环结束时在几英里之外进行。您甚至可以在 for 循环的主体中使用:int w = 0; int z = x * y;,从而限制变量的范围。

标签: c pointers printf iteration


【解决方案1】:

您的代码在 a 中分配了最大产品的值,但您正在打印 largest 这是一个指针。你的程序根本不需要指针largest

你的代码也不起作用,因为你

  • 不检查最大的是否大于前一个
  • 不要在内循环中将y 重置为999

通过以上两个修复,它看起来像:

#include <stdio.h>
#include <stdlib.h>

int main(void){
int x = 999, y = 999, z = 0, w = 0, a=0;

for (x; x > 99; x--){
    for (y=999; y > 99; y--){
        z = x*y;
        while (z != 0){
            w = w * 10;
            w = w + z % 10;
            z = z/10;
        }
        if (x*y == w && a<x*y){
            a = w;
        }
        w = 0;
    }
}
printf("%d\n", a);
return 0;
}

【讨论】:

  • 谢谢,我现在明白发生了什么,或者至少我想我明白了。显然 y 变量在达到 100 后保持不变。至于最大的,我知道它是多余的,只是开始玩弄,因为我无法弄明白
  • 还有一件事,a
  • 呵呵..如果清楚的话,您可以将 a 命名为最大。这可以改进以更早地打破循环。例如,101*101 (10201) 也符合您的条件。但这不是你想要的。我会留给你进一步改进:)
  • 是的,998*998 大于 999*200 之类的,直到我按下回车键发表评论时才想到会发生这种情况:) 至于改进,不要以为我我会花太多时间在这上面,试图解决所有(?)项目欧拉问题,尽管我相信这需要一些时间:)
【解决方案2】:

正如 rakeb 所说,您应该使用: *最大 = &a

除此之外,您没有得到正确答案的原因是您的 if 语句永远不会为真,因此 'a' 将始终保持为 0。

【讨论】:

  • 我觉得这就是正在发生的事情,问题是我不确定为什么会这样
【解决方案3】:

首先,您在语句中将 int 类型分配给 int * 类型

 *largest=a;

让它*最大=&a;

此外,打印时在最大之前使用 * 运算符

stop: printf("%d\n", *largest);

最后把你的逻辑加起来,你检查时可能有问题:

999X999 , 999X998 , 999X997 等等........

但是 999*997 小于 998*998,因此您的代码可能会导致比可能的更低的回文数。

【讨论】:

  • 对,我只留下了最大的和 a,因为我非常绝望并且正在尝试一切,我将它们设置为应有的状态。不过,这将继续返回 0。
  • 不应该是只要一个数字是回文就打印并结束吗?不知道我明白你在说什么
  • 我是说您检查 999X999 是否为 pallindrome。让我们假设它不是。接下来你检查 998X999 是否是一个 pallindrome 。让我们再次假设它不是一个 pallindrome 。现在是主要部分。你检查 999X997 是否是回文。但是 999X998 给出的数字比 999X997 大。因此,当已经有较大的数字要检查时,您将继续检查较小的数字(998X998)。
  • 是的,我想蓝月亮回答这个问题的时候,我猜是没有考虑清楚,谢谢你的注意:)
【解决方案4】:

发布的代码无法干净编译。

建议在编译时始终启用所有警告

(对于 gcc,至少使用 '-Wall -Wextra -pedantic')

修复警告,不要只是试图隐藏它们。

如果仍然显示问题,则发布更正的代码

【讨论】:

  • 在 Visual Studio 中没有这些,使用它进行编译,直到我拿回我的 linux 驱动器,抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多