for loop can be effective in matlab when the loop number is small. it will be time consuming greatly when the loop number are large.
for example in this problem, it ask us to look for the max prime number in range(1,600851475143).
Matlab:
1: the hard way.
clear clc suhsu = []; for i = 1:600851475143, m = []; for j = 1:i, m(j) = mod(i,j); end if(length(find(m == 0)) == 2) sushu = [suhsu i] end end
2: the Sieve of Eratosthenes
hereafter cites from wiki:
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
给出要筛数值的范围n,找出
以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。步骤
详细列出算法如下:
- 列出2以后的所有序列:
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 标出序列中的第一个素数,也就是2,序列变成:
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 将剩下序列中,划摽2的倍数(用红色标出),序列变成:
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 如果现在这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。
- 本例中,因为25大于2的平方,我们返回第二步:
- 剩下的序列中第一个素数是3,将主序列中3的倍数划出(红色),主序列变成:
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 我们得到的素数有:2,3
- 25仍然大于3的平方,所以我们还要返回第二步:
- 现在序列中第一个素数是5,同样将序列中5的倍数划出,主序列成了:
- 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
- 我们得到的素数有:2 3 5 。
- 因为25等于5的平方,跳出循环.
结论:去掉红色的数字,2到25之间的素数是:2 3 5 7 11 13 17 19 23。
m = input('m='); p =2:m; for i = 2:sqrt(m) n = find(rem(p,i) == 0 & p ~= i); %如果p对i取余为0,并且p不等于i p (n) = []; end p
Python: continuing...
a = [] def prime(number): i = 2 while number > 1: if number % i == 0: a.append(i) number = number / i else: i += 1 return max(a) print(prime(600851475143))
来源:https://www.cnblogs.com/sethG/p/3677555.html