Problem 4
Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009=91×99.
Find the largest palindrome made from the product of two 3-digit numbers.
最大回文乘积
回文数就是从前往后读和从后往前读都一样的数。由两个2位数相乘得到的最大的回文数是 9009=91×99。
求由两个3位数相乘得到的最大的回文数。
/*************************** Program 1 ********************************
* 思路:
* 1.从高往低形成2个三位数,判断是否是回文数
* 2.判断方法:比较原数与逆序数是否相等
* 2.先固定一个三位数不动另一个三位数逐渐变小,重复第一部操作
* 3.得到的第一个回文数即使答案
* 收获:
* 1.1. while() + 逗号表达式
* 1.2. static修饰的静态变量在每次使用完毕后都要清空
* 评价:
* 优点:
* 1.能较快地可判断是否是回文数
* 2.可以求多位数的最大回文数,而不局限于三位数
* 3.排除了乘积的重复计算
* 缺点:
* 1.使用递归函数
* 2.调用的函数比较多
* 3.在内存静态区创建了两个变量
************************************************************************/
#define _CRT_SECURE_NO_WARNINGS
#define THE_DIGIT_OF_NUMBERS 3
#include <stdio.h>
/*---------------------------------------------------------------------*/
//求正整数num的逆序数
// num 的取值范围:0~4294967295
unsigned int GetPalindromeNumber(unsigned int num)
{
static unsigned int ret;
static short flag;
if (num > 0)
{
flag = 0;
ret = ret * 10 + num % 10;
GetPalindromeNumber(num / 10);
}
if (!num)// 收获1.2
{
flag++;
return ret;
}
else
ret = 0;
}
//判断正整数num是否是回文数
// num 的取值范围:0~4294967295
//输出:
// 1 num是回文数
// 0 num不是回文数
unsigned int CheckPalindromeNumber(unsigned int num)
{
if (num - GetPalindromeNumber(num))
return 0;
else
return 1;
}
//求 digit位的整数最大值
// digit 的取值范围:1~9
unsigned int GetUpperLimit(unsigned int digit)
{
if (digit == 0)
return 0;
unsigned int upperLimit = 1;
while (upperLimit *= 10, --digit);// 收获1.1
return --upperLimit;
}
int main()
{
//生成两个因数上限和下限
unsigned int upperLimit = GetUpperLimit(THE_DIGIT_OF_NUMBERS);
unsigned int lowerLimit = GetUpperLimit(THE_DIGIT_OF_NUMBERS - 1);
//遍历乘积
unsigned int i, j;
for (i = upperLimit; i > lowerLimit; i--)
for (j = i; j > lowerLimit; j--)
if (CheckPalindromeNumber(i * j))
{
printf("答案是:%d\n", i * j);
return 0;
}
return 0;
}