求100内的所有素数,这里有三种方法,如下public class Prime {
public static boolean isPrime(int num){
for (int i = 2; i < num; i++) {//运行效率不高
if ((num % i) == 0) {
return false;
}
}
return true;
}
public static void main(String[] args){
for(int i = 2; i <= 100; i++) {
if(isPrime(i)){
System.out.print(i + " ");
}
}
}
}public class TestPrime {
public static boolean isPrime(int num) {
for(int i = 2; i <= Math.sqrt(num); i++) {//程序默认2是素数,当j=2时,循环不执行
if(num % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
for(int j = 2; j <= 100; j++) {
if(TestPrime.isPrime(j)) {
System.out.println(j + " is a prime");
}
}
}
}public class PrimeNumber {
//求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 2;j <= (int)Math.sqrt(i);j++) {//把Math.sqrt(i)转换为int类形
if(i % j == 0){
break;
}
if(j >= (int)Math.sqrt(i)) {
System.out.println(i + " is a prime");
}
}
}
}
}
第一种和第二种方法都可以输出正确结果,但第三种方法只能输出5以后的数,2和3不能输出来,请各位帮我看下怎么改,
另外,第一种方法看起来简单,但是效率不高,要循环的次数明显多于后面两种,所以第二种方法是最好的方法,也是最容易看懂的方法。
public static boolean isPrime(int num){
for (int i = 2; i < num; i++) {//运行效率不高
if ((num % i) == 0) {
return false;
}
}
return true;
}
public static void main(String[] args){
for(int i = 2; i <= 100; i++) {
if(isPrime(i)){
System.out.print(i + " ");
}
}
}
}public class TestPrime {
public static boolean isPrime(int num) {
for(int i = 2; i <= Math.sqrt(num); i++) {//程序默认2是素数,当j=2时,循环不执行
if(num % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
for(int j = 2; j <= 100; j++) {
if(TestPrime.isPrime(j)) {
System.out.println(j + " is a prime");
}
}
}
}public class PrimeNumber {
//求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 2;j <= (int)Math.sqrt(i);j++) {//把Math.sqrt(i)转换为int类形
if(i % j == 0){
break;
}
if(j >= (int)Math.sqrt(i)) {
System.out.println(i + " is a prime");
}
}
}
}
}
第一种和第二种方法都可以输出正确结果,但第三种方法只能输出5以后的数,2和3不能输出来,请各位帮我看下怎么改,
另外,第一种方法看起来简单,但是效率不高,要循环的次数明显多于后面两种,所以第二种方法是最好的方法,也是最容易看懂的方法。
public class address {
//求100内的所有素数(质数)
public static void main(String[] args)
{
for(int i = 2;i <= 100;i++)
{
for(int j = 2;j <= (int)Math.sqrt(i);j++)
{//当i=2或者3的时候,此时j=2>sqrt(i),故这个循环不能进去,自然打印不出来2和3了!
if(i % j == 0)
{
break;
}
if(j>= (int)Math.sqrt(i))
{
System.out.println(i + " is a prime");
}
}
}
}
}
知道了问题所在,自己改吧!
1.小范围内判断一个数是否为质数:
function prime (n: integer): Boolean;
var I: integer;
begin
for I:=2 to trunc(sqrt(n)) do
if n mod I=0 then begin
prime:=false; exit;
end;
prime:=true;
end; 2.判断longint范围内的数是否为素数(包含求50000以内的素数表):
procedure getprime;
var
i,j:longint;
p:array[1..50000] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
while i<50000 do begin
if p[i] then begin
j:=i*2;
while j<50000 do begin
p[j]:=false;
inc(j,i);
end;
end;
inc(i);
end;
l:=0;
for i:=1 to 50000 do
if p[i] then begin
inc(l);pr[l]:=i;
end;
end;{getprime}function prime(x:longint):integer;
var i:integer;
begin
prime:=false;
for i:=1 to l do
if pr[i]>=x then break
else if x mod pr[i]=0 then exit;
prime:=true;
end;{prime}
//求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 2;j <= (int)Math.sqrt(i) + 1;j++) {//把Math.sqrt(i)转换为int类形
if(i % j == 0){
break;
}
if(j >= (int)Math.sqrt(i) + 1) {
System.out.println(i + " is a prime");
}
}
}
}
}
但只能输出3,2还是不能输出,是不是要再写一个if,
// 求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 2;j <= (int)Math.sqrt(i) + 1;j++) {//把Math.sqrt(i)转换为int类形 if(i == 2 && j == 2)
{
System.out.println(j + " is a prime");
continue;
}
if(i % j == 0){
break;
}
if(j >= (int)Math.sqrt(i) + 1)
{
System.out.println(i + " is a prime");
}
}
}
}
}
这样每次判断素数只需要计算少数几个(平方数不大于当前数字的素数)缺点也很明显,耗费一些空间,而且判断单个素数时也不适用
public class Prime {
public static void main(String args[]){
int count = 0;
for (int i=101; i<=200; i+=2){
int k = (int)Math.sqrt(i)+1;
for (int j=2; j<=k; j++){
if (i%j == 0)
break;
if (j >= k){
System.out.print(i +", ");
count ++;
}
}
}
System.out.println("\nTotal: "+ count);
}
}
有点掩耳盗铃的感觉(-_-),你要改进你的算法,而不是一味得出结果就算了!
给你说一个很快的方法吧,就是用已知的素数生成未知的素数.见我在下面发的帖子:
http://topic.csdn.net/u/20090404/16/bbf4d3c3-5030-4e9f-9aa2-807048ea46de.html
但是用第三种方法时,不再加个if不会输出2,不知道怎么改下才可以
//求100内的所有素数(质数)
public static void main(String[] args)
{
for(int i = 2;i <= 100;i++)
{
int temp=(int)Math.sqrt(i);
//我把那个aqrt单独提出来,这样速度稍微快一点,虽然在100内变化不大,但如果是10000000内的素数呢?
if(i<=3)//上面我说过,是由于<sqrt(i),那么加个if判断一下就OK了,有那么难么?
{
System.out.println(i + " is a prime");
}
else
{
for(int j = 2;j <= temp;j++)
{//把Math.sqrt(i)转换为int类形
if(i % j == 0)
{
break;
}
if(j >=temp)
{
System.out.println(i + " is a prime");
}
}
}
}
}
}
public class Primes { public static void main(String[] args) {
// 求素数
List<Integer> primes = getPrimes(100000); // 输出结果
for (int i = 0; i < primes.size(); i++) {
Integer prime = primes.get(i);
System.out.printf("%8d", prime);
if (i % 10 == 9) {
System.out.println();
}
}
} /**
* 求 n 以内的所有素数
*
* @param n 范围
*
* @return n 以内的所有素数
*/
private static List<Integer> getPrimes(int n) {
List<Integer> result = new ArrayList<Integer>();
result.add(2); for (int i = 3; i <= n; i += 2) {
if (!divisible(i, result)) {
result.add(i);
}
} return result;
} /**
* 判断 n 是否能被整除
*
* @param n 要判断的数字
* @param primes 包含素数的列表
*
* @return 如果 n 能被 primes 中任何一个整除,则返回 true。
*/
private static boolean divisible(int n, List<Integer> primes) {
for (Integer prime : primes) {
if (n % prime == 0) {
return true;
}
}
return false;
}
}
统计2000000以内的所有的素数。import java.util.*;/**
This program runs the Sieve of Erathostenes bench.
It computes all primes up to 2,000,000.
*/public class Sieve
{
public static void main(String[] s)
{
int n = 2000000;
long start = System.currentTimeMillis();
BitSet b = new BitSet(n + 1);
int count = 0;
int i;
for (i = 2; i <= n; i++)
b.set(i);
i = 2;
while (i * i <= n)
{
if (b.get(i))
{
count++;
int k = 2 * i;
while (k <= n)
{
b.clear(k);
k += i;
}
}
i++;
}
while (i <= n)
{
if (b.get(i))
count++;
i++;
}
long end = System.currentTimeMillis();
System.out.println(count + " primes");
System.out.println((end - start) + " milliseconds");
}
}
//求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 1;j <= (int)Math.sqrt(i);j++) {//把Math.sqrt(i)转换为int类形
if((i % j == 0)&(j>=2)){
break;
}
if(j >= (int)Math.sqrt(i)) {
System.out.print(i + " ");
}
}
}
}
}
可以输出2和3了,不过我有些不清楚其中的原理。
{
for(int i = 2;i < 101;i++)
{int j;
for( j = 2;j <=i/2;j++)
{
if(i%j==0)
break;
}
if(j > i/2)
System.out.println(i+"是素数");
}
}
这种方法可以解决不出现2和3 的问题
int j;
for(int i=1; i<=100; i++)
{
for(j=2; j<=(int)Math.sqrt(i); j++)
{
if(i%j == 0)
break;
}
if(j>=(int)Math.sqrt(i)+1)
{
System.out.print(i+" ");
}
}
public static void main(String args[]){
System.out.println("hello");
enumplus.eplus();
}
}
class enumplus{
public static void eplus(){
for (int i = 2; i <= 100; i++) {
int flag=0;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i%j==0) {
flag=1;
break;
}
}
if (flag==0) {
System.out.println(i);
}
}
}
}
#include <stdio.h>
#include <math.h>
int isPrim(int m);
void printPrim(int m, int n);
int main(void)
{
printPrim(300, 500);
return 0;
}int isPrim(int m)
{
int i; if (m > 1)
{
for (i = 2; i <= sqrt(m); i++)
{
if (m % i == 0)
return 0;
}
}
else if (m == 1 || m == 0)
return 0; return 1;
}void printPrim(int m, int n)
{
int i;
int cnt = 0;
for (i = m; i <= n; i++)
{
if (isPrim(i))
{
printf("%3d ", i);
cnt++;
if (cnt % 10 == 0)
printf("\n");
}
}
}
//求100内的所有素数(质数)
public static void main(String[] args) {
for(int i = 2;i <= 100;i++) {
for(int j = 1;j <= (int)Math.sqrt(i);j++) {//把Math.sqrt(i)转换为int类形
if((i % j == 0) && j >= 2){
break;
}
if(j >= (int)Math.sqrt(i)) {
System.out.println(i + " is a prime");
}
}
}
}
}
完整代码如上