判断101-200之间有多少个素数,并输出所有素数 这个是我写的,请问还有没有更简便的方法,本人初学,只学到循环! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写的还不错,其实C不要到i那么大,到根号i就可以了~ 但是计算根号i所花费的资源估计比循环还大吧, 二分之i应该好些.另外, 循环的时候没必要i++, 应该可以直接i=i+2的, 这样可以少一半循环. 楼主的循环用起来不错,不过貌似有点乱,用集合的话会好很多,给两个随便写的,第二种是属于楼上提供的OOXX算法 public static void main(String[] args) { ArrayList list = new ArrayList(); for(int i =101;i<=200;i++){ if(isPrime(i)) list.add(i); } System.out.println(list+"\n共有"+list.size()+"个素数"); } public static boolean isPrime(int i){ if(i==1) return false; boolean flag = true; for(int j =2;j<=Math.sqrt(i);j++){ if(i%j==0){ flag = false; } } return flag; } public static void main(String[] args) { ArrayList list = new ArrayList(); for(int i =101;i<=200;i++){ list.add(i); for(int j = 2;j<Math.sqrt(200);j++){ if(i%j==0){ list.remove(Integer.valueOf(i)); } } } System.out.println(list+"\n共有"+list.size()+"个素数"); } public class ProgramEx2 { public static void main(String[] args) { // TODO Auto-generated method stub for (int i=101; i<200; i+=2) { boolean f=true; for (int j=2; j<i;j++) { if(i%j == 0) { f = false; break; } } if (!f) { continue; } System.out.println(" "+i); } }}自我感觉也是挺麻烦的 for(int j = 2;j<Math.sqrt(200);j++){应当是:for(int j = 2;j<Math.sqrt(i);j++){ 那个求素数的算法有点问题,让你算一下一百万以内的数字估计就歇菜了。这是我大二时候的一段代码,可以算到十亿以内的数字。public class Factorial { public long factorial(long a) { long resault = 1; if (a % 2 != 0) { for (long i = (a - 1); i >= 1; i--) { resault = resault * i; resault = resault % a; if (0 == resault) { return 0; } } return resault; } else return 0; }}public class Primenumber { /** * @author ROC */ public static void main(String[] args) { Factorial f = new Factorial(); SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒SSS");// 设置日期格式 System.out.println("开始时间为" + df.format(new Date())); int i = 1; try { File file = new File("d:\\1.txt"); FileWriter filewriter = new FileWriter(file, true); for (long j = 1; j <=1000000000 ; j++) { if (0 != f.factorial(j)) { long left = f.factorial(j); long right = j - 1; if (left == right) { //System.out.println("第" + i + "个素数为" + j); filewriter.write("第" + i + "个素数为" + j+"\r\n"); i++; } } } filewriter.close(); } catch (IOException e) { e.printStackTrace(); } }}这段代码放到我们开发的服务器上执行 ,老半天没跑完,后来就放弃了。如果把long换成BigDecimal,可能能算的更大。 总结一下,判断某个特定的数比如1023是不是素数,直接FOR i = 2 TO sqrt(1023) STEP 2的测试就可以了但是,如果筛选一个范围内,有多少素数,如果范围较大的话,筛选法是必须的。 public static void main(String[] args) { ArrayList list = new ArrayList(); for(int i =101;i<=200;i+=2){ if(isPrime(i)){ System.out.println(i}; } } public static boolean isPrime(int i){ if(i==1) return false; boolean flag = true; for(int j =2;j<=Math.sqrt(i);j++){ if(i%j==0){ flag = false; break; } } return flag; } 谁能告诉我将URL类对象转化成File类对象的方法 try-catch-finally 问题 怎样用*画一个圆圈 实现逆矩阵的算法! 一个数组合并问题(JAVA) 问一个JFrame的问题 如果有一份这样的工作放在你面前,你会动心吗? 请部,Graphics2D中,如何设置打印边距? 请问这种情况下有什么好的安全解决方案吗?谢谢。 请教,如果选出数据库中一条记录(比如一万条中的第3000条) 新人求教一个关于classloader动态加载类并实例化得问题的问题 解题!
但是计算根号i所花费的资源估计比循环还大吧, 二分之i应该好些.另外, 循环的时候没必要i++, 应该可以直接i=i+2的, 这样可以少一半循环.
public static void main(String[] args) {
ArrayList list = new ArrayList();
for(int i =101;i<=200;i++){
if(isPrime(i))
list.add(i);
}
System.out.println(list+"\n共有"+list.size()+"个素数");
}
public static boolean isPrime(int i){
if(i==1)
return false;
boolean flag = true;
for(int j =2;j<=Math.sqrt(i);j++){
if(i%j==0){
flag = false;
}
}
return flag;
} public static void main(String[] args) {
ArrayList list = new ArrayList();
for(int i =101;i<=200;i++){
list.add(i);
for(int j = 2;j<Math.sqrt(200);j++){
if(i%j==0){
list.remove(Integer.valueOf(i));
}
}
}
System.out.println(list+"\n共有"+list.size()+"个素数");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=101; i<200; i+=2) {
boolean f=true;
for (int j=2; j<i;j++) {
if(i%j == 0) {
f = false;
break;
}
}
if (!f) {
continue;
}
System.out.println(" "+i);
}
}}自我感觉也是挺麻烦的
for(int j = 2;j<Math.sqrt(200);j++){
应当是:
for(int j = 2;j<Math.sqrt(i);j++){
这是我大二时候的一段代码,可以算到十亿以内的数字。public class Factorial { public long factorial(long a) {
long resault = 1;
if (a % 2 != 0) {
for (long i = (a - 1); i >= 1; i--) {
resault = resault * i;
resault = resault % a;
if (0 == resault) {
return 0;
}
}
return resault;
}
else return 0;
}
}
public class Primenumber { /**
* @author ROC
*/
public static void main(String[] args) {
Factorial f = new Factorial();
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒SSS");// 设置日期格式
System.out.println("开始时间为" + df.format(new Date()));
int i = 1;
try {
File file = new File("d:\\1.txt");
FileWriter filewriter = new FileWriter(file, true);
for (long j = 1; j <=1000000000 ; j++) {
if (0 != f.factorial(j)) {
long left = f.factorial(j);
long right = j - 1;
if (left == right) {
//System.out.println("第" + i + "个素数为" + j);
filewriter.write("第" + i + "个素数为" + j+"\r\n");
i++;
}
}
}
filewriter.close();
} catch (IOException e) {
e.printStackTrace();
} }
}这段代码放到我们开发的服务器上执行 ,老半天没跑完,后来就放弃了。如果把long换成BigDecimal,可能能算的更大。
FOR i = 2 TO sqrt(1023) STEP 2
的测试就可以了但是,如果筛选一个范围内,有多少素数,如果范围较大的话,筛选法是必须的。
ArrayList list = new ArrayList();
for(int i =101;i<=200;i+=2){
if(isPrime(i)){
System.out.println(i};
}
}
public static boolean isPrime(int i){
if(i==1)
return false;
boolean flag = true;
for(int j =2;j<=Math.sqrt(i);j++){
if(i%j==0){
flag = false;
break;
}
}
return flag;
}