[Project Euler] 来做欧拉项目练习题吧: 题目004
[Project Euler] 来做欧拉项目练习题吧: 题目004
周银辉
问题描述:
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.
(先思考,如果有兴趣先编程试试,然后才看下面的内容)
问题分析:
求两个三位数相乘能都得到的最大回文数(回文:从前到后阅读和从后向前阅读都一样)
很简单的思路:a: 100~999 b: 100~999 ,然后对每个a*b进行判断其是否是回文数,然后在找出最大的。
先看如何判断一个数(比如9119)是否是回文数。
你可以利用itoa和strrev将其转换成字符串,然后调用字符串反转函数,最后看反转后的字符串和原字符串是否相等,但我更建议下面的方法:
然后是挨个去试乘积是否是回文数,并找出最大的:
int a, b, c, max=0;
for(a=100; a<=999; a++)
{
for(b=100; b<=999; b++)
{
c = a*b;
if(is_palindromic(c) && c>max)
{
max = c;
}
}
}
但注意到,上面的两个for循环是可以优化的:
由于,题目要求的是最大的回文数而不是求所有的,所以for循环应该从999向100递减,这样当发现当前的c值小于上一次计算出来的回文数时,就可以停止循环了,因为接下来的值会更小:
int a, b, c, max=0;
for(a=999; a>=100; a--)
{
for(b=999; b>=100; b--)
{
c = a*b;
if(c<max)
{
break;
}
if(is_palindromic(c))
{
max = c;
}
}
}
再来,由于乘法具有交换律,所以a=x, b=y 和 a=y, b=x所得乘积是一样的,那么上面的两层循环存在重复运算,最简单的例子是a=1,b=999时和a=999, b=1时,所以代码可以写成:
注:当完成题目后,对于某些题,官方网站会给出参考答案,在我的博客里不会将官方答案贴出来,仅仅会写下我自己当时的思路,除非两者不谋而合。另外,如果你有更好的思路,请留言告诉我,我非常乐意参与到讨论中来。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
2008-01-14 MY LUCKY DAY