判断一个数是否是素数与验证哥德巴赫猜想问题
素数:
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的地位。
哥德巴赫猜想:任意一个大于等于6的偶数都可以分解为两个素数之和;
如何判断一个数是否是素数呢?
一般的方法是用For循环迭代,而迭代变量的范围一般是取到我们要求的值,比如说是100,范围即为到100,经过大量的验证,一种更有效率的方法是,迭代变量的取值范围不用取到100,而是取得100的开根号即可;
下面给出判断是否为素数的代码:
public static boolean isPrime(int num) {
int sqrt = (int) Math.sqrt(num);
for (int i = 2; i <= sqrt; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
然而,如何判断一个数是否是素数的方法,已经知道了,下面再来验证哥德巴赫猜想,为什么前面会给出验证是否是素数的方法呢?
因为验证哥德巴赫猜想需要用到它;
现在我们再来看定义:
哥德巴赫猜想:任意一个大于等于6的偶数都可以分解为两个素数之和;
两个素数?普通的做法就是用两个For循环迭代,判断两次是否为素数,然而一种更有效率的方法是:
先判断P1是素数,而且判断 P2=n-P1也是素数,如果是这样的话,就输出结果,这样是不是比两次For循环迭代更有效率呢?
下面我们再给出如何验证哥德巴赫猜想的代码:
for(int j = 6;j<100;j+=2){
for(int i = 2; i < j ; i++){
if(isPrime(i)&& isPrime(j-i)){
System.out.println(j+"="+i+" + "+(j-i));
break; // 找到一对即跳出循环
}
}
}
这些简单的算法问题,在很多有过算法经验的人看来,都是一些不值一提的小算法,但事情往往是这样的,很多高深的算法也是由一些看似简单的算法演变而来的,所以我们不能掉以轻心;
以上算法代码及思想,用作学习交流之用,如果有什么地方写得不对的,敬请批评指出,谢谢~