项目Euler 4 - 5位回文

时间:2014-11-05 00:43:26

标签: c palindrome

我必须在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位数或者我应该这样做吗?

1 个答案:

答案 0 :(得分:0)

更改内循环以进行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++;
        }