Project Euler | Problem 4

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值