【问题标题】:Project Euler 4 - 5 digits palindrome欧拉计划 4 - 5 位回文
【发布时间】:2014-11-05 00:43:25
【问题描述】:

我必须在 Project Euler 网站上解决问题 4 以完成作业:

最大回文积

回文数的两种读法相同。由两个 2 位数乘积构成的最大回文数是 9009 = 91 × 99。

找出由两个 3 位数乘积构成的最大回文数。

#include <stdio.h>
int main()
{
    int i,j,palindrome[1000],n,temp,k=0,num[10],max,digits;
    for(i=999;i>=320;i--)
    {
        for(j=999;j>=320;j--)
        {
            n=i*j;
            temp=n;
            digits=0;
            do
            {
                num[digits]=temp%10;
                temp/=10;
                digits++;
            }
            while(temp!=0);
            if(num[0]==num[5] && num[1]==num[4] && num[2]==num[3])
            {
                palindrome[k]=n;
                k++;
            }
        }
    }
    max=palindrome[0];
    for(i=1;i<k;i++)
    {
        if(palindrome[i]>=max)
        max=palindrome[i];
    }
    printf("%d\n",max);
}

我得到了正确答案,但我的代码仅适用于 6 位数字,它应该检查从 100*100(10000,5 位)到 999*999(998001,6 位)的数字。

我的代码检查从 320*320 到 999*999。

那么它可以修复为使用 5 位数字还是我应该这样保留它?

【问题讨论】:

  • i*j 对于更大的数字来说太大了,int 无法处理;请改用unsigned intunsigned long long
  • 回文数组没有意义;只保留你找到的最大的(并记录最后打印出来的因素)。您还应该测试 5 位数字以正确解决问题,(但最大的显然有 6 位数字)。
  • @UncleO 你说得对,这个数组毫无意义,我只能找到 max 并将其放入变量中
  • 您还不必要地检查产品两次。内循环应该是for(j=999;j&gt;=i;j--)

标签: c palindrome


【解决方案1】:

更改内部循环以进行 digits/2 测试。

num[10] 的位数可以是 1 到 10。

        // As int is good to _at least_ 32k, use long
        // long is good to _at least_ 2M
        long n = (long)i * j;
        long temp = n;

        do {
          ...
        } while(temp!=0);

        bool same = true; 
        for (int a=0; a<digits/2; a++) {
          if (num[a] != num[digits-1-a]) same = false;
        }
        if (same) {
            palindrome[k]=n;
            k++;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多