题目:输出100以内的所有质数。 质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。


题目:输出100以内的所有质数

质数:素数,只能被1和它本身整除的自然数。–>从2开始,到这个数-1结束为止,都不能被这个数本身整除。


一、基本实现(下面有优化)

class PrimeNumberTest {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值

		for(int i = 2;i <= 100;i++){//遍历100以内的自然数
			
		
			for(int j = 2;j < i;j++){//j:被i去除
				
				if(i % j == 0){ //i被j除尽
					isFlag = false;
				}
				
			}
			//
			if(isFlag == true){
				System.out.print(i + “   ”);
			}
			//重置isFlag
			isFlag = true;
		
		}
	}
}

运行结果:

2   3   5   7   11   13   17   19   23   29   31   37   41   43   47   53   59   61   67   71   73   79   83   89   97   


二、分别从质数和非质数两个方面优化

100000以内的所有质数的输出。实现方式一
质数:素数,只能被1和它本身整除的自然数。–>从2开始,到这个数-1结束为止,都不能被这个数本身整除。

class PrimeNumberTest1 {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
		int count = 0;//记录质数的个数

		//获取当前时间距离1970-01-01 00:00:00 的毫秒数
		long start = System.currentTimeMillis();

		for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
			
			//优化二:对本身是质数的自然数是有效的。
			//for(int j = 2;j < i;j++){
			for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
				
				if(i % j == 0){ //i被j除尽
					isFlag = false;
					break;//优化一:只对本身非质数的自然数是有效的。
				}
				
			}
			//
			if(isFlag == true){
				//System.out.println(i);
				count++;
			}
			//重置isFlag
			isFlag = true;
		
		}

		//获取当前时间距离1970-01-01 00:00:00 的毫秒数
		long end = System.currentTimeMillis();
		System.out.println("质数的个数为:" + count);
		System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13

	}
}

运行结果

质数的个数为:9592
所花费的时间为:24

三:用break和continue的标签优化

class PrimeNumberTest2 {
	public static void main(String[] args) {
		
		
		int count = 0;//记录质数的个数

		//获取当前时间距离1970-01-01 00:00:00 的毫秒数
		long start = System.currentTimeMillis();

		label:for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
			
			for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
				
				if(i % j == 0){ //i被j除尽
					continue label;
				}
				
			}
			//能执行到此步骤的,都是质数
			count++;
		
		}

		//获取当前时间距离1970-01-01 00:00:00 的毫秒数
		long end = System.currentTimeMillis();
		System.out.println("质数的个数为:" + count);
		System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13

	}
}
质数的个数为:9592
所花费的时间为:25

总结

一定要学好数据结构,算法优化和不优化相差十万八千里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 题目要求输出100以内的所有素数,每行输出10个。素数就是只能被1和自身整除的正整,1不是素数,2是素数。要求定义和调用函prime(m)判断m是否是素数,当m为素数时返回1。 解决方法如下: 定义prime(m)函: def prime(m): if m == 1: # 1不是素数 return 0 for i in range(2, m): if m % i == 0: # 如果m能被i整除,说明m不是素数 return 0 return 1 # 否则m是素数 输出100以内素数: count = 0 # 计器,用于控制每行输出10个 for i in range(1, 101): if prime(i) == 1: # 如果i是素数输出i print(i, end=' ') # 不换行输出 count += 1 if count % 10 == 0: # 每行输出10个 print() # 换行 print() # 最后再换一行,避免输出不完整 输出结果如下: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ### 回答2: 素数学中一个非常重要的概念,它指的是只能被1和自身整除的正整。在小于100的范围内,有很多素数,我们需要用代码来列出这些素数。 其实找素数的方法很简单,只需要从2开始,依次判断每个是否为素数,如果是素数输出它。在这里我们可以定义一个函来判断一个是否为素数: def prime(m): if m == 1: return 0 for i in range(2, m): if m % i == 0: return 0 return 1 这个函接受一个整m作为参,首先判断m是否等于1,如果是的话就直接返回0,因为1不是素数。然后从2开始,依次判断m能否被2,3,4,...,m-1整除,如能整除就说明m不是素数,返回0。如果遍历完所有可能的因不能整除,就说明m是素数,返回1。 有了这个函,我们就可以用循环从2到100依次判断每个是否为素数,如是素数输出它,最后每输出10个素数就换一行: count = 0 for i in range(2, 101): if prime(i): print(i, end=' ') count += 1 if count % 10 == 0: print() 这个循环从2到100遍历每个,如果它是素数输出它。输出时使用end参将每个打印在同一行上,每输出一个素数就让count加1,当count是10的倍时就说明已经输出了10个素数,需要换行。 最终的结果如下: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 其中每行输出了10个素数,每个素数之间用空格隔开。 ### 回答3: 要求输出100以内的全部素数,可以从2开始一个个地判断每个是否为素数,如果是则输出。这个过程可以通过定义一个函prime(m)来实现,该函可以判断一个正整m是否为素数。具体实现代码如下: ```python # 定义prime(m)函判断m是否为素数 def prime(m): if m == 1: # 1不是素数 return 0 # 返回0 elif m == 2: # 2是素数 return 1 # 返回1 else: # 对于其他正整,一个个判断是否有因子 for i in range(2, m): if m % i == 0: # 如果能被i整除,说明不是素数 return 0 # 返回0 return 1 # 否则是素数,返回1 # 输出100以内的全部素数 count = 0 for i in range(2, 101): if prime(i): # 如果i是素数 print(i, end='\t') # 输出i,并用制表符分隔 count += 1 # 每输出一个素数,计器加1 if count % 10 == 0: # 每输出10个素数,换行 print() # 输出换行符 ``` 在上面的代码中,定义了一个prime(m)函来判断一个正整m是否为素数。当m等于1时,返回0,说明1不是素数;当m等于2时,返回1,说明2是素数;对于其他正整m,从2到m-1一个个检查是否有因子,如果有,则返回0,说明m不是素数;如果没有,则返回1,说明m是素数。在主程序中,通过一个for循环遍历2到100之间的所有正整,每遍历一个正整就调用prime(m)函判断是否是素数,如果是,则输出并用制表符分隔,同时计器加1;每输出10个素数,则换行。 最终输出结果如下: ``` 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 ``` 可以看到,这个程序能够正确地输出100以内的全部素数,并且每行输出10个。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码起来呗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值