首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回文编号- Euler项目问题4

回文编号- Euler项目问题4
EN

Code Review用户
提问于 2015-10-11 11:19:32
回答 3查看 468关注 0票数 2

项目Euler问题#4:最大回文产品

回文数字的读取方式是相同的。由两位数乘积而成的最大回文数为9009 = 91×99.找到最大的回文由两个3位数的乘积而成.

我得到了这个问题的正确答案,但是我想知道我的编码风格对这个解决方案是好的还是坏的。

我需要知道如何改进我的编码,如果它是不好的,并以更一般的方式编写。

代码语言:javascript
复制
#include<stdio.h>
#define MAX 999
#define START 100

int main()
{
   int i,j,current,n,prev = 0;
for(i = START;i<=MAX;i++)
{
    for(j=START;j<=MAX;j++)
    {
        current = j * i;
        if(current > prev)  /*check the current value so that if it is less need not go further*/
        {
            n = palindrome(current);
            if (n == 1)
            {
                printf("The palindrome number is : %d\n",current);
                prev = current;  // previous value is updated if this the best possible value.
            }
        }
    }
}
}

int palindrome(int num)
{
int a[6],temp;
temp = num;
/*We need a array to store each element*/
a[5] = temp % 10;       
a[4] = (temp/10) %10;
a[3] = (temp/100) %10;
a[2] = (temp/1000) %10;
a[1] = (temp/10000) %10;
if(temp/100000 == 0)
{
    a[0] = 0;
    if(a[1] == a[5] && a[2] == a[4])
        return 1;
}
else
{
    a[0] = (temp/100000) %10;
    if(a[0] == a[5] && a[1] == a[4] && a[2] == a[3])
        return 1;
    else
        return 0;
}
}
EN

回答 3

Code Review用户

发布于 2015-10-11 13:37:33

  1. 首先,您只对最大的数字感兴趣,那么为什么您从底部开始??校正,允许您省去一个显式的下边界,动态边界可以根据当前最佳结果来计算。
  2. 你为什么不从命令行读取上界呢?
  3. 正确的缩进对于快速、准确地读取源代码,以及在您的例子中查找出errors.都是非常有价值的帮助,在您的大部分代码中缺少的一个层次的缩进可能是在这里草率发布的工件。不管是不是,别那么做。
  4. 您依赖于palindrome的隐式定义。别那么做,改变他们的立场。
  5. int的保证范围只有-32767到32767。使用long (或unsigned long),它具有适当的范围,而不依赖于实现依赖的行为。
  6. 为什么要使用数组和所有这些工具来检查是否是回文,简单地倒转是容易的:无符号长反向(无符号长in) {无符号长r= 0;for(;in;in /= 10) r=r* 10 + in % 10;返回r};}

最终程序(论科尔鲁):

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

static int is_palindrome(const unsigned long in) {
    unsigned long r = 0;
    for(unsigned long x = in; x; x /= 10)
        r = r * 10 + x % 10;
    return r == in;
}

int main(int argc, char* argv[]) {
    unsigned long max = argc > 1 ? strtoul(argv[1], 0, 10) : 0;
    if(!max || max > 9999)
        max = 999;
    unsigned long _a = 0, _b = 0, _m = 0; // best yet
    for(unsigned long a = max, a_min = 1; a >= a_min; --a)
        for(unsigned long b = max, b_min = _m / a + 1; b >= b_min; --b)
            if(is_palindrome(a*b)) {
                _a = a, _b = b, _m = a*b, a_min = _m / max + 1;
                break;
            }
    printf("Biggest palindrome-number which is product of two natural numbers"
        " no bigger than %lu: %lu = %lu * %lu\n", max, _m, _a, _b);
    return 0;
}
票数 1
EN

Code Review用户

发布于 2015-10-11 12:25:52

您可以使回文检测功能更加通用,这样它就可以轻松地处理任何int

代码语言:javascript
复制
/* Range of int is -2,147,483,648 to 2,147,483,647 */
#define MAX_INT_DIGITS 10

int is_palindrome(int num)
{
    int idx;
    int count = 0;
    int digits[MAX_INT_DIGITS];

    while (num) {
        digits[count] = num % 10;
        num /= 10;
        ++count;
    }

    for (idx = 0; idx < count / 2; ++idx) {
        if (digits[idx] != digits[count - idx]) {
            return 0;
        }
    }

    return 1;
}

特别要注意的是,神奇的数字10 (在您的代码中是6 )是如何以代码阅读器的利益命名的。

此外,由于您正在寻找最大的可能值,所以最好从大到小的值迭代,并尽早地跳出循环:

代码语言:javascript
复制
#define MAX_3_DIGIT 999
#define MIN_3_DIGIT 100

int main()
{
    int i, j;
    int largest_palindrome = 0;

    for (i = MAX_3_DIGIT; i >= MIN_3_DIGIT; --i) {
        if (MAX_3_DIGIT * i <= largest_palindrome) {
            break;
        }
        for (j = MAX_3_DIGIT; j >= MIN_3_DIGIT; --j) {
            int value = i * j;

            if (value <= largest_palindrome) {
                break;
            }
            if (is_palindrome(value)) {
                largest_palindrome = value;
                break;
            }
        }
    }
    return largest_palindrome;
}
票数 0
EN

Code Review用户

发布于 2015-10-11 13:29:01

有一种不使用数组来检查数字回文的简单方法,但是可以使用int来反转数字。

代码语言:javascript
复制
int isPalindrome(int n) {
    int np = 0;
    for(int r = n; r > 0; r /= 10) {
       np *= 10;
       np += r % 10; 
    }
    return n == np;
}

MAX一直运行到START也更好,因为当您找到第一个回文时,可以立即中断。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/107206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档