黑马程序员技术交流社区
标题:
我在求一个区域的素数时遇到疑问,请大侠帮帮忙。
[打印本页]
作者:
黄嵘才
时间:
2012-12-17 14:02
标题:
我在求一个区域的素数时遇到疑问,请大侠帮帮忙。
要求:
2. 用户输入一个整数范围,程序列出该范围内的所有素数? 我调用。int[] isPrime(int a, int b)
没有能够装素数装入数组并返回。请问,我该怎么样做才能够返回一个全是素数的组啊?
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Exp2 {
public static void main(String args[]) throws IOException{
// new Exp2().judge1();
new Exp2().judge2();
}
/*
* 一个区域的素数。
*/
public void judge2() throws IOException{
String line;
int num;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
line = br.readLine();
String[] s = line.split(",");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
int[] result = isPrime(a,b);
for(int i=0; i<result.length; i++){
System.out.println(result[i]);
}
}
/*
* 判断素数。
*/
public static boolean isPrime(int a){
int temp;
temp = (int) Math.sqrt(a);
for(int i=2; i<=temp; i++){
if(temp%i==0){
return false;
}
}
return true;
}
/*
* 求一个区域的素数。
*/
public static int[] isPrime(int a, int b){
int[] nums = new int[b-a];
int pos = 0;
for(int i=a; i<=b; i++){
//判断素数,是?并装入
if(isPrime(i)){
nums[pos++] = i;
}
}
return nums;
}
}
复制代码
作者:
孙辉辉
时间:
2012-12-17 14:50
很明显,你的
/*
* 判断素数。
*/
public static boolean isPrime(int a){
int temp;
temp = (int) Math.sqrt(a);
for(int i=2; i<=temp; i++){
if(temp%i==0){
return false;
}
}
return true;
}
复制代码
这一块代码写错了,你可以测试下当你输入的时候判断的也是非素数,原因是temp = (int) Math.sqrt(a);这一句,
如果输入是5,那么temp = 2,temp%2==0 ,返回ture
应该改为
public static boolean isPrime(int a){
int temp;
temp = (int) Math.sqrt(a);
for(int i=2; i<=temp; i++){
if(a%i==0){
return false;
}
}
return true;
}
作者:
黄嵘才
时间:
2012-12-17 15:37
孙辉辉 发表于 2012-12-17 14:50
很明显,你的这一块代码写错了,你可以测试下当你输入的时候判断的也是非素数,原因是temp = (int) Math.sq ...
谢谢。
我想再追加一个问:
我该怎么样定义一个数组,才能够恰好是我的素数的个数。?
或许我不应该使用其他容器。能提供一些方法吗?
int[] nums = new int[b-a];
int pos = 0;
for(int i=a; i<=b; i++){
//判断素数,是?并装入
if(isPrime(i)){
nums[pos++] = i;
作者:
孙辉辉
时间:
2012-12-17 16:23
。。如果是直接用数组的话貌似不好直接获得是多少个,必须要跑完了才能知道是多少个,因此开始定义数组的时候需要定义的大一点,当然这样的话会存在很大的浪费,
作者:
舒远
时间:
2012-12-17 16:34
你无法知道你的数组应该是多大。那么在遍历的时候就没法确定的创建出你想要的数组。
两种方案:
1.用StringBuilder或者SringBuffer来拼接你得到的素数。最后将这样的字符串转化成数组返回。
2.用集合临池存储最后将集合转化成数组。当然如果用集合了也就没必要再转成数组了。
作者:
舒远
时间:
2012-12-17 16:37
你以上的代码很有可能创建了一个数组却没有装入任何数据的情况。浪费空间。。就算按你那样创建数组也至少是
int[] nums = new int[b-a + 1] ;//这里需要+1,比如2-3范围的数组就有两个。。
作者:
filter
时间:
2012-12-17 16:43
public void judge2() throws IOException{
15. String line;
16. int num;
17. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
18.
19. line = br.readLine();
20. String[] s = line.split(",");
21. int a = Integer.parseInt(s[0]);
22. int b = Integer.parseInt(s[1]);
23. int[] result = isPrime(a,b);
24. for(int i=0; i<result.length; i++){
if(result
!= 0)
//加个判断
25. System.out.println(result
);
}
数组长度在创建的时候就固定了,你要返回恰好是要的长度可以考虑集合或者StringBuffer容器
作者:
黄嵘才
时间:
2012-12-18 10:33
一并感谢大家的热情回复。我明白了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2