阅读 24997 次
发表时间:2011-04-11
import java.util.ArrayList;
import java.util.List;

public class Prime {
	
	private List<Integer> primes = new ArrayList<Integer>();
	
	private int maxPrime = 3;
	
	private static Prime instance = new Prime();
	
	/**
	 * Singleton.
	 */
	private Prime() {
		primes.add(2);
		primes.add(3);
	}
	
	private void addPrime (int integer) {
		if (integer <= maxPrime) { // All primes already found.
			return;
		}
		for (int prime : primes) { // Search for greater prime.
			if (integer % prime == 0) {
				return;
			}
		}
		primes.add(integer); // Found greater prime.
		maxPrime = integer; // Set the greatest prime.
	}
	
	public static void printPrimes(int topInt) {
		if (topInt > instance.maxPrime) { // Still primes not found.
			for (int i = instance.maxPrime + 2; i <= topInt; i+= 2) {
				instance.addPrime(i);
			}
		}
		for (int prime : instance.primes) {
			if (topInt < prime) { // Just print to the input integer.
				break;
			}
			System.out.println(prime);
		}
	}
	
	public static void main(String[] args) {
		Prime.printPrimes(100);
	}

}

发表时间:2011-04-12
毕业2年就已经忘记了什么是素数的在javaeye什么水平?
发表时间:2011-04-12
这个问题,在大一学的c语言(就是谭浩强那本书)的时候,就已经知道了,至于那个效率问题,我的确已经忘记了。
发表时间:2011-04-12
很明显LZ 想证明自己是圣人。。。
发表时间:2011-04-12
kdlan 写道
感觉LZ的方法还是慢
最快的还是占用大量内存空间筛数
根据已经筛出的素数进行再筛选
步长为每相邻两个素数的差值,也就是每次都会变
这个比固定步长肯定要快

这个应该比模6,模30快些
每产生一个素数,则辐射后面n个该素数步长的数,打标
遇到第一个没覆盖打标的点即为新素数,这是i*j ++递增的优选法,避免了模6,模30的被动匹配,模30只是剔除了,2,3,5的合数空间,7,11...后面的合数(无2,3,5因子)都需要数次%
发表时间:2011-04-12
求100内的质数何必那么麻烦:

                for (int i = 2; i < 100; i++) {
if(i==2||i==3||i==5||i==7){
System.out.println(i+"\t");
}
if (i % 2 == 0) {
continue;
} else if (i % 3 == 0) {
continue;
} else if (i % 5 == 0) {
continue;
} else if(i % 7==0){
continue;
}
else{
System.out.println(i+"\t");
}
}

不过一个常写Web程序的一下子想不起来并不奇怪。尺有所短,存有所长。
发表时间:2011-04-12
这个并不能证明国内程序员的水平。别人一天到晚给外包做项目哪有时间整这些玩意。
发表时间:2011-04-12
		long start = System.currentTimeMillis();
		int[] nums = new int[1000000];
		for(int i = 2; i <= nums.length/2; i ++){
			for(int j = 2; j * i < nums.length; j ++){
				nums[i * j] = 1;
			}
		}
		for(int i = 0; i < nums.length; i ++){
			if(nums[i] == 0)
				System.out.print(i + ",");
		}
		long end = System.currentTimeMillis();
		System.out.println("\ntime:" + (end-start) + "ms");


貌似这样也可以做,因为j从2开始,所以i可以只到一半就可以了是吧?
这里花的时间几乎90%都在打印这个数出来了。真正筛选的时间貌似是很少(如果这算法正确的话)
我测试了一下结果好像是对的,但不知道怎么评价呀。
确实是长久都没接触,忘得差不多了。
发表时间:2011-04-12
当年高中数学130的的路过,发现自己完全忘记质数的定义以及怎么求质数了
稍稍看了下,终于记起判断的方法是该数字只要不被1到这个数字平方根以内的其它质数整除就是了,前面的都是到一半,没必要了吧
看来平常还是得看看各种算法的东西,感觉思维都僵硬了
发表时间:2011-04-12
kimmking 写道
lzyzizi 写道
引用
......n>=i*i 比i<=sqrt(n) 表示不懂。。。
用费马小定理+去除马歇尔数 测试过的数,可否100%可以通过?


不能~举个范例 341 过得了费马,不是卡米歇尔数,但是他不是质数。

341 是卡米歇尔数

问题是如何判断是卡米歇尔数,使用其他测试方法,还是有漏掉的。。。


第一个卡米歇尔数是561~~~
对于341,我举出一个反例 6**340 % 341 = 56. gcd(6,341)=1

一些卡米歇尔数参考:
http://oeis.org/A002997
Global site tag (gtag.js) - Google Analytics