欧拉计划问题四matlab实现

Problem4: 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 x 99.

Find the largest palindrome made from the product of two 3-digit numbers.

思路:

  首先了解一下什么是回文数,就是说从左往右读,或从右往左读都是一样的,比如828,1221, 75157,328823 等等,随便举了几个例子,我一想觉得这样的回文数有很多,于是我顺便写了个代码测试一下,得到由两位数相乘得到的回文数确实很多。

据题意由两位数相乘所得的最大回文数是9009,并且可以因式分解为91乘以99,首先两位数相乘的范围是【100,9801】,发现最大回文数是接近范围的上限的,那么同理三位数相乘的范围是【10000,999801】,那么我们先大胆的猜测最大回文数应该是接近999801的,我们采用逆向思维,从上限反推回去,那么我们得到的第一个回文数就是最大回文数!当我们遇到问题的时候,胡适先生说过要大胆假设,小心求证。OK,我们先大胆假设一个回文数,比如说下图这个数,我们一分为二来说,回文数满足的条件为:

$$ \left\{ \begin{aligned} n1 & = n6 \\ n2 & = n5 \\ n3 & = n4 \end{aligned} \right. $$

如果满足上述条件,则让该回文数除以一个变量 i,该变量从999到100循环,如果能被整除,则显示出来,语言总是很苍白,直接上代码,其中floor函数就是商取整.

比如 x = floor(5/4),那么x就等于1,而不是等于1.25,mod函数就是取余函数,比如说y=mod(10,5)  那么y就等于0,详细的可以参见matlab的帮助文档,要多学习去看matlab帮助文档,编写matlab软件的人才是最懂这个软件的人。

clear,clc;
for k =999801:-1:100000
    n1 = floor(k/100000);                           %首位--n1
    n6 = mod(k,10);                                 %末位--n6
    if n1 == n6
        n2 = mod(floor((k-n6)./10000),10);          %第二位--n2
        n5 = floor(mod((k-n6),100)/10);             %第五位--n5
        if n2 == n5
            n3 = floor(mod((k-n6),10000)./1000);    %第三位--n3
            n4 = floor(mod(mod((k-n6),10000),1000)/100);%第四位--n4
            if n3 == n4
                for i = 999:-1:100
                    if mod(k,i) == 0
                       n7 = fix(k/i);
                       n8 = floor(n7/100);
                       n9 = floor(i/100);
                       if n8 == n9 
                           disp(k),disp(i);
                            break
                       end
                   end
                end
            end
        end
    end
end

代码可能比较冗余,大家有什么好的想法可以贴出来一下,大家相互交流,共同进步!

猜你喜欢

转载自blog.csdn.net/qq_38910271/article/details/82945899