回文数字的读取方式是相同的。由两位数乘积而成的最大回文数为9009 = 91×99.找到最大的回文由两个3位数的乘积而成.
我得到了这个问题的正确答案,但是我想知道我的编码风格对这个解决方案是好的还是坏的。
我需要知道如何改进我的编码,如果它是不好的,并以更一般的方式编写。
#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;
}
}发布于 2015-10-11 13:37:33
palindrome的隐式定义。别那么做,改变他们的立场。int的保证范围只有-32767到32767。使用long (或unsigned long),它具有适当的范围,而不依赖于实现依赖的行为。最终程序(论科尔鲁):
#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;
}发布于 2015-10-11 12:25:52
您可以使回文检测功能更加通用,这样它就可以轻松地处理任何int:
/* 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 )是如何以代码阅读器的利益命名的。
此外,由于您正在寻找最大的可能值,所以最好从大到小的值迭代,并尽早地跳出循环:
#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;
}发布于 2015-10-11 13:29:01
有一种不使用数组来检查数字回文的简单方法,但是可以使用int来反转数字。
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也更好,因为当您找到第一个回文时,可以立即中断。
https://codereview.stackexchange.com/questions/107206
复制相似问题