leetcode-479-Largest Palindrome Product(找到两个乘数相乘得到的最大的回文数)
题目描述:
Find the largest palindrome made from the product of two n-digit numbers.
Since the result could be very large, you should return the largest palindrome mod 1337.
Example:
Input: 2
Output: 987
Explanation: 99 x 91 = 9009, 9009 % 1337 = 987
Note:
The range of n is [1,8].
要完成的函数:
int largestPalindrome(int n)
说明:
1、给定一个数字n,我们可以形成一个n位的数字(十进制),比如n=2,那么我们可以形成99或者98或者12这些两位的数字。
要求从两个n位的数字的积中找到最大的回文数,比如n=2,那么我们可以形成99/99这两个2位的数字,然后积是9801,不是回文数,那么我们就要继续往下找,99*98=9702,也不是……一直往下找,直到99*91=9009这个回文数。
由于回文数数值比较大,所以我们返回回文数%1337的结果就好。
2、这道题传统解法是找到n位数字的最大可能值和最小可能值,比如n=2,那么上限就是99,下限就是10,然后在上下限之间的数字彼此相乘,逐个判断是否为回文数。
这种方法也能解出来,不过就是很慢。
你得找出所有数字相乘得到的积,然后一个个判断是否是回文数。
但找出所有数字相乘得到的积,不能像下面这样写:
bool ishuiwen(long t)
{
long result=0,t1=t;
while(t!=0)//得到反转之后的数,存储在result中
{
result=result*10+t%10;
t/=10;
}
return result==t1;
}
int largestPalindrome(int n)
{
if(n==1)
return 9;
int uplim=pow(10,n)-1,lowlim=pow(10,n-1);
long t;
for(long i=uplim;i>=lowlim;i--)//双重循环
{
for (long j=i;j>=lowlim;j--)
{
t=i*j;
if(ishuiwen(t))
return t%1337;
}
}
}
上面这样写会出错的,因为双重循环从最开始的 i = 99,然后 j 一直减小,直到 i 和 j 相乘的结果是一个回文数,假设是99*55。但可能还有一个更大的回文数,假设是98*89这种,而98*89这个结果根本不会被计算出来,我们算到99*55就return了。
我们用双重循环的话,得计算出所有相乘的结果,然后一个个判断是否是回文数,最后返回最大的那个。
这样做太慢了。
我们尝试一下生成法,生成所有可能的回文数,然后逐个判断是否是上下限之间的数相乘的结果。这样能大大减少需要判断的个数,而且判断的过程就是判断能不能整除,非常快速。
代码如下:(附详解)
long buildhuiwen(int n)//建立回文数
{
long n1=n,result=0;
while(n!=0)
{
result=result*10+n%10;
n/=10;
n1*=10;
}
return n1+result; }
int largestPalindrome(int n)
{
if(n==1)
return 9;
int uplim=pow(10,n)-1,lowlim=pow(10,n-1);//得到上限是uplim,下限是lowlim
for(int i=uplim;i>=lowlim;i--)
{
long cand=buildhuiwen(i);//建立2n位的回文数,比如i=99,那么建立的回文数是9999,比如i=98,建立的回文数9889,构造回文序列。
for (long j=uplim;j*j>=cand;j--)//判断得到的回文数是否能整除n位的数字
{
if(cand%j==0)
return cand%1337;
}
}
}
上述代码中的外层循环,构造了一个回文序列,如果n=2,那么构造的回文序列是9999,9889,9779,9669,9559,9449……
接着在内层循环中,判断构造的每一个回文数是否能整除n位数。
这样做快了很多,减少了要判断的个数,而且判断过程也简化了,只需要判断是否整除。
细心的同学可能会发现,内层循环中的long j=uplim;j*j>=cand;j--,c++支持大数乘法了……
之前c++11没出的时候,大数乘法和加法都是要手工写代码实现的,现在不用啦。
上述代码实测366ms,beats 86.19% of cpp submissions。
leetcode-479-Largest Palindrome Product(找到两个乘数相乘得到的最大的回文数)的更多相关文章
- 【easy】479. Largest Palindrome Product
Find the largest palindrome made from the product of two n-digit numbers Since the result could be v ...
- 479 Largest Palindrome Product 最大回文数乘积
你需要找到由两个 n 位数的乘积组成的最大回文数.由于结果会很大,你只需返回最大回文数 mod 1337得到的结果.示例:输入: 2输出: 987解释: 99 x 91 = 9009, 9009 % ...
- 【LeetCode】479. Largest Palindrome Product 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 479. Largest Palindrome Product
class Solution { public: int largestPalindrome(int n) { vector<,,,,,,,}; ]; } }; 这里的穷举法,你不得不服
- 【欧拉计划4】Largest palindrome product
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1371281760.html 原创:[欧 ...
- [LeetCode] Largest Palindrome Product 最大回文串乘积
Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...
- [Swift]LeetCode479. 最大回文数乘积 | Largest Palindrome Product
Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...
- Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2 ...
- (Problem 4)Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2 ...
随机推荐
- 深入理解那该死的BOM
BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF.这个标记是可选的,因为UTF8字节没有顺序, ...
- MFC The Screen Flickers When The Image Zoomed
问题描述 当初写MFC也是不情愿的. 既然写了,遇到一些问题. 解决也废了一切功夫.所以简单的记录一下. 这个问题,也就是使用MFC显示图像的时候, 放缩图像的过程中, 图像会一闪一闪的. 这个问题的 ...
- 未能加载文件或程序集"xxxxxx"或它的某一个依赖项
错误:未能加载文件或程序集“xxx”或它的某一个依赖项.试图加载格式不正确的程序. 原因分析:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题. 解决方案:IIS——应 ...
- jquery获得/修改html标签
1.添加 meta$("head").append('<meta http-equiv="content-type" content="text ...
- Differential expression analysis for paired RNA-seq data 成对RNA-seq数据的差异表达分析
Differential expression analysis for paired RNA-seq data 抽象背景:RNA-Seq技术通过产生序列读数并在不同生物条件下计数其频率来测量转录本丰 ...
- linux查看端口号监听状态
lsof -i:<port> netstat -tunlp | grep <port>
- [.NET] WeakReference的使用
声明:本篇博客翻译自:http://tipsandtricks.runicsoft.com/CSharp/WeakReferences.html 由于水平(技术水平+英语理解能力)有限/不足,肯定会有 ...
- cucumber安装步骤
#Start Guide##Environment###1. Install Ruby Verify your installation by running ruby -v in a termina ...
- 从Objective-C到Swift,你必须会的(二)组合options
用过Options这个东西的人都知道,几个竖线就把这些值都和到一起了.比如: + (NSStringDrawingOptions)combine{ return NSStringDrawingTrun ...
- .NET基础 (09)常用集合和泛型
常用集合和泛型1 int[]是引用类型还是值类型2 数组之间如何进行转换3 解释泛型的基本原理4 什么是泛型的主要约束和次要约束 常用集合和泛型1 int[]是引用类型还是值类型 数组类型是一族类型, ...