序
本人为MATLAB小菜鸟,本博客作为阶段学习的小总结,欢迎大家学习交流!
题目三
题目意思是求一个较大的数的最大质因数,传统的方法求解比较麻烦,运算速度较慢。质因数,顾名思义,一方面是因数,第二个方面是素数,也即质数。
思路
1.可以通过rem(x,y)==0首先判断是否为待求数的因数,不断刷新n的值。但这个过程i的值在不断的增大,这会造成输出的数不一定为最大的质因数,所以加入第二个循环,从2开始重新刷新,直到找出最后的一个不能再被整除的数,这个数就是最大质因数。
2.通过查阅,isprime(i)可以用来判断一个数是否为素数,是输出1,不是输出0。只要让i从2开始递增,能被i整除,且是素数,通过i的增加不断刷新找到最大质因数,但缺点是需要预设一个i的范围。
3.结合1和2,3为通用版的求出最大质因数的方法,首先判断i是否为素数和整除,是说明此时i为一个质因数(最小的),刷新n的值的同时,刷新i的值,i从当前的i值开始重新计算,直到计算出最后一个不能再被整除的数,这个数就是最大的质因数。
代码块
方法一
%方法一
%初步想法,较为复杂
clear;
i=2;
n= 600851475143;
while(i^2<=n)%n的值会发生改变,例如当初值n设置为28时,第二次循环时n已经变成了14,
if(rem(n,i)==0) %输出为14,并不是最大的质因数。
result=i;
n=n/i;
end
i=i+1;
end
for x=2:sqrt(n)
if(mod(n,x)==0)
result=x;
n=n/x;
end
x=x+1;
end
result=n;
disp('最大质因数:')
result
方法二
%方法二
%参考的算法,有一定的弊端,对于较小的数i的范围需要修改
clear;
n=600851475143;
for i=2:100000
if mod(n,i)==0&&isprime(i)
result=i;
end
end
result
方法三
%方法三
%利用isprime函数判断是否为素数的算法
clear;
i=2;
n=600851475143;
while(i^2<=n)%n的值会发生改变
if(mod(n,i)==0&&isprime(i))
result=i;
n=n/i;
i=result-1;
end
i=i+1;
end
result=n;
fprintf('最大质因数为:%d\n',result);
答案
最大质因数为:6857
最后,欢迎大家的批评指正,一起交流!