各位八仙过海各显神通,但是没有注释的代码看起来很费劲,特别是有的函数不是Matlab的基础函数(如fullfact)
大家都忽略了这是个输出个数有限的问题。n位数的循环质数如下:
bit1 = 2,3,5,7,
bit2 = 11,13,17,31,37,71,73,79,97,
bit3 = 113,131,197,199,311,337,373,719,733,919,971,991,
bit4 = 1193,1931,3119,3779,7793,7937,9311,9377,
bit5 = 11939,19391,19937,37199,39119,71993,91193,93719,93911,99371,
bit6 = 193939,199933,319993,331999,391939,393919,919393,933199,939193,939391,993319,999331
bit7 = 7位数:无
bit8 = 8位数:无
bit9 = 9位及更高位数的没有涉及到,猜测循环质数应该不存在。
因为个数有限(至少在9位数以下),因此从解决问题的实用角度可以先找出某一范围内所有的循环质数再查表:
[code]
function [nums,output] = myprimes(x)
Circle_primes = [...
2,3,5,7,...
11,13,17,31,37,71,73,79,97,...
113,131,197,199,311,337,373,719,733,919,971,991,...
1193,1931,3119,3779,7793,7937,9311,9377,...
11939,19391,19937,37199,39119,71993,91193,93719,93911,99371,...
193939,199933,319993,331999,391939,393919,919393,933199,939193,939391,993319,999331];
output = Circle_primes( x >= Circle_primes ); % 输出比x小的循环质数。
nums = length(output);
[\code]
从决解问题的角度看,这个“算法”最快,Just for fun。
(Given a number x, write a MATLAB script that will tell you the number of circular primes less than or equal to x
as well as a sorted list of what the circular prime numbers are.)
这个问题(如上)应该描述为在某个范围内寻找这些循环质数的的最快算法。(其实大家都是这样做的)
很显然要判断质数,程序绕不开isprime这个耗时的函数(不大可能自己搞个什么算法),因此尽量减少需要判断质数的数量。
最快的是用[1,3,7,9]这几个数字(可以直接是double等数值类型,不必通过char转换)进行排列组合。(显然其它数字不可能构成循环质数)
再在这基础上删除能被3整除的数(或者再根据什么规律删除其他非质数,尽量不用isprime来判断),
减少需要调用isprime的个数。然后再进行判断。
另外,程序运行时间除了与机器配置等有关外,还与程序本身的具体参数有关,及myprimes(x)中参数x的值。
显然x = 100时, x = 1e6时 和 x = 1e8 时的运行时间是有很大的差别的。
没有标明这些,单独列出的运行时间是没有太大的参考价值的,即使是同一台机子。 |