用for循环写出1-100的所有质数,各位大佬求教

qq_45322543 2019-06-27 09:24:15
/*写出1到100之内的所有质数



*/

public class ForTest05{
public static void main(String[] args){
boolean flag = true ;//是质数
for(int i=2;i<100;i++){

for(int j=2;j<i;j++){
if(i%j==0){
flag =false ;
break;
}

}
if(flag== true){
System.out.println(i);
}
}
}
}



求各位告诉我为什么最后得出的是2和3啊
boolean flag = true ;为什么在for循环里面和外面不一样啊,在外面不是也可以作用于for循环吗。为什么答案不一样
...全文
3493 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Game Boys 2020-08-10
  • 打赏
  • 举报
回复
你的flag作用范围是全局,这种问题可以debug调试,注意flag值的变化
爪哇牛 2020-07-31
  • 打赏
  • 举报
回复
public class Sushu1 { public static void main(String args[]) { int primes[] = new int[50]; primes[0] = 2; int cnt = 1; MAIN_LOOP: for ( int x=3 ; cnt<primes.length ; x++) { for( int i=0 ; i<cnt ; i++) { if ( x%primes[i] == 0) //把x放到数组中 { continue MAIN_LOOP; } } primes[cnt++] = x; } for ( int k : primes) { System.out.print(k+" "); } System.out.println(); } }
  • 打赏
  • 举报
回复
你没有重置flag
BoRoBoRoMe 2020-02-21
  • 打赏
  • 举报
回复
boolean flag = true ;为什么在for循环里面和外面决定了flag的作用范围 作用范围包括代码中哪些地方可以访问,还包括生命周期,每个生命周期的开始flag都不被初始化为flase 问题就出在这里 flag = false被移除for循环的时候,flag在进入for循环时的初始值变了。 flag在for循环里面时,flag固定初始化为true 在for外面的时候,flag在遇到false之后就一直是false 代码还是要严格执行规范,尽量减少变量的作用域
hexiang@ 2020-02-20
  • 打赏
  • 举报
回复
package studyProgram; import java.util.Scanner; /** * * @content:找出一个区间内的素数 * @author:H烊X * @time:2020年2月20日下午8:23:02 */ public class JudgePrimeNumber { private static Scanner input; public static void main(String[] args) { int start = 0, end = 0,newline = 0,count = 0; input = new Scanner(System.in); System.out.println("系统将帮您找出您规划的区间中的素数,下面请按指令进行:"); System.out.println("输入起始区间数:"); start = input.nextInt(); System.out.println("请输入终止区间数:"); end = input.nextInt(); System.out.println(start + "~" + end + "之间的素数有:"); for (int i = start; i <= end; i++) { boolean flag = true;// 是质数 for (int j = 2; j < i; j++) { if (i % j == 0) { flag = false; break; } } if (flag) { count++; if(newline++%10==0) System.out.println(); System.out.print(i + "\t"); } } System.out.println("\n\n"+ start + "~" + end + "之间共有个" + count + "素数"); } }
游北亮 2019-06-27
  • 打赏
  • 举报
回复
以前还写过一个用bitmap实现的,能在4秒内找到2亿以内的所有质数,不过是用C#写的,参考:
/// <summary>
/// 找出指定区间的全部素数返回.
/// 注1:maxValue只支持最大2亿,如果需要超过2亿,请考虑拆分2个数组,重新实现
/// 注2:批量查找一百万以内的素数,此方法只需要5毫秒,循环调用IsPrime要200毫秒.
/// 2亿以内有11078937个素数,本方法耗时约4秒
/// </summary>
/// <param name="maxValue"></param>
/// <param name="minValue"></param>
/// <returns></returns>
public static List<int> GetPrimes(int maxValue = 200000000, int minValue = 2)
{
    if (maxValue < minValue)
    {
        throw new ArgumentException("最小值不能比最大值还大");
    }
    if (maxValue > 200000000)
    {
        throw new ArgumentException("最大值不能超过2亿,避免内存溢出");
    }
    // 从0开始,所以对result的引用,都要减1
    var result = new bool[maxValue];
    result[2-1] = true;
    result[3-1] = true;

    // 标记非2的倍数为 质数
    for (var i = 5; i <= maxValue; i += 2)
    {
        result[i - 1] = true;
    }

    var sqrt = Math.Sqrt(maxValue);
    for (var i = 3; i <= sqrt; i++)
    {
        if (result[i - 1])
        {
            // 标记当前质数的倍数为 非质数
            for (var inner = i + i; inner <= maxValue; inner += i)
            {
                result[inner - 1] = false;
            }
        }
    }
    var ret = new List<int>();
    for (var i = minValue; i <= maxValue; i++)
    {
        if (result[i - 1])
        {
            ret.Add(i);
        }
    }
    return ret;
}
游北亮 2019-06-27
  • 打赏
  • 举报
回复
写个优化了一点的,for循环少一半:

public List<Integer> ccc() {
    List<Integer> ret = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        if (isPrime(i))
            ret.add(i);
    }
    return ret;
}

static boolean isPrime(int num) {
    if (num < 2)
        return false;
    if (num < 4) // 2和3是质数
        return true;
    if (num % 2 == 0)
        return false;

    // i+=2 减少一半循环
    for (int i = 3, end = (int) (Math.sqrt(num) + 1); i < end; i += 2) {
        if (num % i == 0)
            return false;
    }
    return true;
}
weixin_40290083 2019-06-27
  • 打赏
  • 举报
回复
weixin_40290083 2019-06-27
  • 打赏
  • 举报
回复
public class Test { public static void main(String[] args) { for(int i = 2;i <= 100; i++) { boolean flag = true; for(int j = 2;j < (int)(Math.sqrt(i) + 1);j++) { flag = i % j != 0; if(!flag) { break; } } if(flag) { System.out.println(i); } } } }
weixin_40290083 2019-06-27
  • 打赏
  • 举报
回复
i在循环时要重新对flag进行赋值。
我很快乐- 2019-06-27
  • 打赏
  • 举报
回复
public class test {

	public static void main(String[] args) {
		
		for (int i = 2; i <= 100; i++) {
			boolean flag = true;
			for (int j = 2; j <= i - 1; j++) {
				if (i % j == 0) {
					flag = false;
					break;
				}
			}
			if (flag) {
				System.out.println(i);
			}
		}
	}
}
我很快乐- 2019-06-27
  • 打赏
  • 举报
回复
public class test {

	public static void main(String[] args) {
		boolean flag=true;
		for (int i = 2; i <= 100; i++) {
			for (int j = 2; j <= i - 1; j++) {
				if (i % j == 0) {
					flag=false;
					break;
				}
			}
			if (flag) {
				System.out.println(i);
			}
			flag=true;
		}
	}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧