Java 循环嵌套问题三:100以内质数的输出以及优化(笔试题)

本文详细讲解了如何使用循环嵌套找出100以内的质数,并通过优化内层循环和检查边界条件,展示了代码执行时间和效率的改进。重点介绍了从sqrt(i)判断开始、跳出非质数循环的技巧,以及算法在大规模数据下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

质数是只有一和它本身才能被除尽的一类数,输出100以内的质数本质还是循环嵌套

首先,外层循环遍历100以内的自然数,因为1不是质数,所以从2开始,内层循环从1开始到自己本身结束,每个数都被i除一次,这里我们反其道而行之,我们先定义一个布尔类型的变量isFlag赋值为true,如果在内层循环的时候 i 除以 j 的时候出现了i%j==0的情况也就是出现了除了 i 自己和1以外其他的约数,就给isFlag赋值false,相当于贴了一个标签,说明当此循环的i不是质数。然后我们在接下来的判断过程中,当isFlag为true时,在外层循环里输出i的值,这样就可以输出符合条件的质数.

代码如下

import java.util.Scanner;
public class zhishu {
	public static void main(String[] args) 
	{
		long start=System.currentTimeMillis();
		for(int i=2;i<=100;i++) 
		{
			boolean isFlag=true;
			for(int j=2;j<i;j++) 
			{
				if(i%j==0) 
				{
					isFlag=false;
				}
				
			}
			if(isFlag==true) 
			{
				System.out.println(i);
			}

		}
		long end=System.currentTimeMillis();
		System.out.println("所花费的时间为:"+(end-start));
	}
}

	}
}

运行结果如下:

接下来是算法的优化:我们从内层循环入手,i%j==0的时候,将faluse 赋给Flag以后,说明这个数已经判断不是质数了,我们也没有判断下去的必要了,所以我们在其后加上break

代码如下:

public class zhishu1 {
	public static void main(String[] args) 
	{
		long start=System.currentTimeMillis();
		for(int i=2;i<=10000;i++) 
		{
			boolean isFlag=true;
			for(int j=2;j<i;j++) 
			{
				if(i%j==0) 
				{
					isFlag=false;
					break;
				}
				
			}
			if(isFlag==true) 
			{
				System.out.println(i);
			}

		}
		long end=System.currentTimeMillis();
		System.out.println("所花费的时间为:"+(end-start));
	}
}

100的对比不明显,我们将数量增加到10000

结果如下

可以很明显的看到时间减少了很多

我们还可以再优化,也就是我们没必要从1到10000遍历,我们可以从1到它的平方根就可以(这里涉及数学知识,小郭不太行,等我学会了回来解释)

代码如下:

public class zhishu2 {
	public static void main(String[] args) 
	{
		long start=System.currentTimeMillis();
		for(int i=2;i<=10000;i++) 
		{
			boolean isFlag=true;
			for(int j=2;j<=Math.sqrt(i);j++) 
			{
				if(i%j==0) 
				{
					isFlag=false;
				}
				
			}
			if(isFlag==true) 
			{
				System.out.println(i);
			}

		}
		long end=System.currentTimeMillis();
		System.out.println("所花费的时间为:"+(end-start));
	}
}

结果如下

所用的时间更少了

在以后的编程中会有很多特别大的数,为了使程序能够平稳运行,我们要尽可能的进行优化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差劲的厉害了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值