/*寫出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回圈嗎。為什么答案不一樣
uj5u.com熱心網友回復:
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;
}
}
}
uj5u.com熱心網友回復:
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);
}
}
}
}
uj5u.com熱心網友回復:
i在回圈時要重新對flag進行賦值。uj5u.com熱心網友回復:
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);
}
}
}
}
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
寫個優化了一點的,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;
}
uj5u.com熱心網友回復:
以前還寫過一個用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;
}
uj5u.com熱心網友回復:
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 + "素數");
}
}
uj5u.com熱心網友回復:
boolean flag = true ;為什么在for回圈里面和外面決定了flag的作用范圍作用范圍包括代碼中哪些地方可以訪問,還包括生命周期,每個生命周期的開始flag都不被初始化為flase
問題就出在這里
flag = false被移除for回圈的時候,flag在進入for回圈時的初始值變了。
flag在for回圈里面時,flag固定初始化為true
在for外面的時候,flag在遇到false之后就一直是false
代碼還是要嚴格執行規范,盡量減少變數的作用域
uj5u.com熱心網友回復:
你沒有重置flaguj5u.com熱心網友回復:
參考:https://blog.csdn.net/weixin_44563573/article/details/103350503
uj5u.com熱心網友回復:
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();
}
}
uj5u.com熱心網友回復:
你的flag作用范圍是全域,這種問題可以debug除錯,注意flag值的變化轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/26070.html
標籤:Java SE
