MATLAB脚本质数的判断

来源:互联网 发布:淘宝买东西卖家发两份 编辑:程序博客网 时间:2024/05/16 18:42

最近打算从小学的课本开始学着练习MATLAB的脚本编程了。练习效果还不错,下面就是代码:

% 这个脚本判断给定a变量是否为质数。% 运行这个脚本之前需先要给a变量赋值。i=2;b=0;% 循环部分共计循环a-3次。% 循环代码意义:% 判断a变量从2开始一直到a-1的数中是否含有能够整除a的数值存在;% 若存在则输出判断结果信息并终止循环;% 若不存在则继续循环并使i自增1。while i<a    if rem(a,i)==0 % 第一个if        b=rem(a,i);        disp('这个数值不是质数');        break;    end % 第一个if的结束    i=i+1;end % while语句的结束% 直到循环结束后b的值被改变为大于零,则说明% 排除1和a变量本身的值外,没有数值能够整除a即% 从2到a-1的数值中不含有能够整除a的值存在。if b>0 % 第二个if    disp('这个数值是质数');     end % 第二个if的结束

这段代码经过移植到矩阵元素判断的时候,问题依旧出现了,下面我们就来探讨一下问题的根源究竟是哪里。

首先我们要按照正常程序书写的顺序进行,第一步便是说面原理:

1.代码原理

质数的概念:在自然数中,除了“1”以外,只能被1和它本身整除的数叫做质数,又叫素数,例如2,3等。在自然数中,除了“1”和质数以外的数叫做合数,例如4,6等。“1”既不是质数也不是合数。

2.原理分析

在除法运算中任何自然数都能够被“1”和它本身整除,而质数特别,它只能被“1”和它本身整除,其他数不能整除。那么我们便依据质数概念将任意数的“1”和它本身以及大于它本身的数排除在外,我们设这个数为a,则刚刚我们所提到的数据范围可表示为2<=a<=a-1,且a属于整数。那么在2<=a<=a-1的数据范围中如果没有任何数值能够整除a那么就说明a是个质数。这就是这段程序的本质原理,依据这个原理我们可以编写出非常精炼的判断质数的代码。

===

注意:程序细节问题,其中while循环部分中break启动的原理是只要遇到从2开始第一个能够整除a的数,则break终止循环。则此时b=0如果不终止,继续循环至a-1的值的时候如果a-1的值为不能够整除a。就会将b再度赋值为大于0的某个数值,此时result又会再度被赋值为这个数值是质数,而我们之前已经明确在判断区间中确实含有能够整除数值a的数值存在,就因为没有break终止循环进行,便造成了结果的再度更改,致使判断失效。因此这个问题也同样是移植到其他代码段中需要重点考虑的问题之一。

===

3.设计程序流程

                                  a变量赋值

                                            |

                                    程序初始化

                                     i=1,b=inf

                                            |

      #######################################

     #                            循环环境                                           #

     # —————————————————————  #

     #                           条件: i<a                                            #

     # —————————————————————  #

     #               执行:判断 a/i 的余数是否为0                   #

     #                                       |                                              #

     #    ####*#######################*#####   #

     #             |                                                       |               #

     #            Y                                                      N             #

    #              |                                                       |              #

    #   b=0 ,输出结果信息                                  |              #

    #       这个值不是质数                              无执行        #

    #######################################

                                                    |

          执行:判断经过循环求解后b的值是否大于0

                                                   |

   #####*#############################*########

              |                                                                     |

             Y                                                                    N

              |                                                                     |

  输出结果信息                                                      无执行

  这个值为质数

4.代码编写

function [result]=prime(a)i=2;b=inf;while i<a    if rem(a,i)==0        b=rem(a,i);        result='这个数值不是质数';        break;    end     i=i+1;end if b>0    result='这个数值是质数';    end

5.添加注释

function [result]=prime(a)% 这个脚本判断给定a变量是否为质数。% 运行这个脚本之前需先要给a变量赋值。i=2;b=inf;% 循环部分共计循环a-3次。% 循环代码意义:% 判断a变量从2开始一直到a-1的数中是否含有能够整除a的数值存在;% 若存在则输出判断结果信息并终止循环;% 若不存在则继续循环并使i自增1。while i<a    if rem(a,i)==0 % 第一个if        b=rem(a,i);        result='这个数值不是质数';        break;    end % 第一个if的结束    i=i+1;end % while语句的结束% 直到循环结束后b的值被改变为大于零,则说明% 排除1和a变量本身的值外,没有数值能够整除a即% 从2到a-1的数值中不含有能够整除a的值存在。if b>0 % 第二个if    result='这个数值是质数';    end % 第二个if的结束



这回我们不难发现其实错误很简单,就是b的初始值错误。

最开始我将b的初始值赋为0后来发现,如果b的初始值为0那么在第二段if判断既b>0的判断过程中会丢失处理,也就会丢失处理的结果。

但是b的初始值为inf的话,经过循环b的值依旧为大于零,便说明无数值能够整除a因此程序成立。

这算是独立进行的一次从原理到算法再到代码的一次尝试,充分体会到代码编写中良好习惯的重要性,首先呢就是清楚的分析问题,考虑清楚每一步的可能性,否则每遗漏一点都会造成程序的崩溃,当然后果自然是差之毫厘谬以千里。

当然第一次尝试毕竟是第一次尝试,在代码的设计阶段依旧存在着诸多问题。以后的代码设计就要按照具体的严格的书写顺序一步一步的进行了,反反复复的调试带来的麻烦真是相当的多。而且前期设计准备不足,对后期甚至以后的代码移植的问题也会留下众多的祸根。

因为设计不足定然理解得就不可能充分。

今天上午又搜索了相关的算法发现可以将数值区间缩小为sqrt(a),这样搜索的时长便会再度缩减。

代码如下

function [result]=prime(a)% 这个脚本判断给定a变量是否为质数。% 运行这个脚本之前需先要给a变量赋值。i=2;b=inf;% 循环部分共计循环a-3次。% 循环代码意义:% 判断a变量从2开始一直到a-1的数中是否含有能够整除a的数值存在;% 若存在则输出判断结果信息并终止循环;% 若不存在则继续循环并使i自增1。while i<sqrt(a)    if rem(a,i)==0 % 第一个if        b=rem(a,i);        result='这个数值不是质数';        break;    end % 第一个if的结束    i=i+1;end % while语句的结束% 直到循环结束后b的值被改变为大于零,则说明% 排除1和a变量本身的值外,没有数值能够整除a即% 从2到a-1的数值中不含有能够整除a的值存在。if b>0 % 第二个if    result='这个数值是质数';    end % 第二个if的结束

然后今天下午呢,又尝试了一下矩阵的质数判定,闲话少说先把代码贴出来:


function [result]=primem(a)[r c]=size(a);i=1;while i <= r    j=1;    while j <= c        d=a(i,j);        % 这个脚本判断给定a变量是否为质数。        % 运行这个脚本之前需先要给a变量赋值。        i1=2;        b=inf;        % 循环部分共计循环a-3次。        % 循环代码意义:        % 判断a变量从2开始一直到a-1的数中是否含有能够整除a的数值存在;        % 若存在则输出判断结果信息并终止循环;        % 若不存在则继续循环并使i自增1。        while i1<sqrt(d)            if rem(d,i1)==0 % 第一个if                b=rem(d,i1);                a(i,j)=0;                result=a;                break;            end % 第一个if的结束            i1=i1+1;        end % while语句的结束        % 直到循环结束后b的值被改变为大于零,则说明        % 排除1和a变量本身的值外,没有数值能够整除a即        % 从2到a-1的数值中不含有能够整除a的值存在。        if b>0 % 第二个if            a(i,j)=1;            result=a;        end % 第二个if的结束        j=j+1;    end    i=i+1;endresult=a;

这段代码经过运行时长测试,200*200 的magic矩阵,1秒钟出结果(2.533 GHZ CPU  1/3开 运行环境速率)。

有机会再将程序设计相关内容贴上。之后再详细讨论。

原创粉丝点击