Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 素数测试,两位数_Java_Loops_Primes - Fatal编程技术网

Java 素数测试,两位数

Java 素数测试,两位数,java,loops,primes,Java,Loops,Primes,我想打印所有两位数长的素数。这是我的密码: for(int input = 11; input <= 99; input += 2){ for(int x = 2; x < (int)Math.sqrt(input) + 1; x++){ if(input%x != 0){ System.out.println(input); break; }els

我想打印所有两位数长的素数。这是我的密码:

    for(int input = 11; input <= 99; input += 2){
        for(int x = 2; x < (int)Math.sqrt(input) + 1; x++){
            if(input%x != 0){
                System.out.println(input);
                break;
            }else{
                break;
            }
        }
    }

维基百科提供了一个很好的查找素数的算法。它还列出了最多100个素数


如果您正在寻找调试帮助,我只需逐步检查您的代码,直到您看到哪些测试不正确。这是一个快速简单的程序,不会花费您太长时间。

for(int input=11;input您正在打印所有奇数。您总是打破循环,因此
x
永远不会超过2

for(int input = 11; input <= 99; input += 2){
    int found = 0;
    for(int x = 2; x < (int)Math.sqrt(input) + 1; x++)
        if(input%x == 0){
            found = 1;
            break;
        }
    if(found == 0)
        System.out.println(input);

}
if(input%x != 0){
    System.out.println(input);
    break;  // <<-- break here
}else{
    break;  // <<-- and break here
}
if(输入%x!=0){
系统输出打印项次(输入);

break;//你的素数测试不正确。一旦你找到一个不能被输入的除数,你就停止测试一个数字(
输入

这不是素数的定义-您需要测试
输入
数字不能被任何小于它的除数整除-换句话说,您需要测试
x
的所有值,然后才能将数字声明为素数


当一个
输入可被
x
整除时,您可以中断检查
输入%x!=0的循环,但当它不可整除时,则不能中断检查循环-您需要继续检查此条件是否为真!

是,因为它会打印出找到非因子的所有情况。
您只需要打印出找不到任何因素的案例。

这是有效的。您可以看到输出

公共类主{
公共静态void main(字符串[]args){

对于(int input=11;input我总是喜欢那些最短、最明显的答案就是对输出进行硬编码的问题:

System.out.println("11\n13\n17\n19\n23\n29\n31\n37\n41\n43" +
   "\n47\n53\n59\n61\n67\n71\n73\n79\n83\n89\n97");

问题出在这一块:

if(input%x != 0)
{
System.out.println(input);
break;
}
如果“input”不能被当前值“x”整除,它将打印“input”,但它可能会被下一个值“x”整除。在这种情况下,“input”不是素数,但会打印出来

正确代码:

boolean flag;
for(int input = 11; input <= 99; input += 2)
{
        flag = true;
        for(int x = 2; x < (int)Math.sqrt(input) + 1; x++)
        {
            if(input%x == 0)
            {
                flag = false;
                break;
            }
        }
        if(flag == true)
            System.out.println(input);
}
布尔标志;

对于(int-input=11;input要找到一个素数,您不需要测试它下面的每个数字直到它的平方根;您只需要测试它下面的每个其他素数。下面是一个演示:

ArrayList<Integer> primes = new ArrayList<Integer>(); // hold every other prime numbers that we find
boolean isPrime;

// add first base prime number
primes.add(2);

for (int x = 3; x < max; x+=2) {  // start from 3 and skip multiples of 2
    isPrime = true;  // prove it's not prime
    for (Integer i : primes) {
        if (x % i == 0) {
            isPrime = false; // x is divisible by a prime number... 
            break; // exit loop, we proved it's not a prime
        }
    }
    if (isPrime) {
        if (x >= 10) {
            System.out.println(x);  // print only two digits prime numbers
        }
        primes.add(x);  // add x to our prime our number list for future checks
    }
}
ArrayList primes=new ArrayList();//保留我们找到的每一个素数
布尔互质;
//加上第一个基素数
添加(2);
对于(int x=3;x=10){
System.out.println(x);//只打印两位素数
}
primes.add(x);//将x添加到素数列表中以备将来检查
}
}
**编辑**

静态方法中更灵活和可重用的实现(未针对列出大素数进行优化):

公共静态列表findTime(int-min,int-max){
LinkedList primes=新LinkedList();
布尔互质;
双正方形;
//加上第一个基素数
添加(2);
对于(int x=3;x平方){
打破
}
}
如果(iPrime){
素数。加(x);//给素数加x
}
}
//删除最小值以下的所有数字
而(!primes.isEmpty()&&primes.getFirst()
方法用法:

List<Integer> primes = findPrimes(10, 100);
System.out.println("Listing " + primes.size() + " prime numbers");
for (Integer prime : primes) {
    System.out.println(prime);
}
List primes=findPrimes(10100);
System.out.println(“列表”+primes.size()+“素数”);
for(整数素数:素数){
System.out.println(prime);
}

可能与您的问题无关,但这两个
break
语句似乎是多余的。这很容易调试,为什么不使用调试器?-1这甚至不编译。您不能使用int作为条件。即使它编译了,也不会打印所需的输出。您确定它不会打印所需的输出吗?我想您的解决方案打印相同的内容……:/“您需要测试输入数字不能被任何小于它的除数整除”是不正确的,您不需要每隔测试一个数,只需每隔低于它的素数测试一次就可以节省更多的工作,只需测试您的数的sqrt,因为任何超过它的值都需要一个小除数,或最终高于您的数:)嗯,是的,我们可以采取某些优化措施-我只是想解释素数的正确定义。投票被否决。这是家庭作业,OP需要掌握循环。建议的解决方案解决了问题,但忽略了更大的一点。@Seva:放松点。已经有6个很好的答案贴出来帮助OP处理他的家庭作业k当我发布这篇文章的时候。我只是想说,对于某一组需求,过度设计是很容易的。顺便说一句,仅仅因为一些SO成员称之为家庭作业,然后在没有OP确认的情况下将其标记为家庭作业,并不意味着它是或应该被视为家庭作业。事实上,这是OP规范的最佳解决方案科学问题。如果问题是打印素数直到出现内存不足错误,那就不同了。“不要比你需要的更复杂或浪费”这也是一堂非常重要的课。如果这确实是家庭作业,OP就不会得到好分数。他们在另一个班上学习过多工程的危险;我想这节课是关于编码的基础。@ArtWorkAD:它给出了正确的结果。没有打印非素数。请再次检查。
public static List<Integer> findPrimes(int min, int max) {
    LinkedList<Integer> primes = new LinkedList<Integer>();
    boolean isPrime;
    double square;

    // add first base prime number
    primes.add(2);

    for (int x = 3; x < max; x+=2) {  // start from 3 and skip multiples of 2

        isPrime = true;  // prove it's not prime
        square = Math.sqrt(x);
        for (Integer i : primes) {
            isPrime = x % i != 0;  // x is not prime if it is divisible by i
            if (!isPrime || i > square) { 
                break;
            }
        }
        if (isPrime) {
            primes.add(x);  // add x to our prime numbers
        }
    }

    // remove all numbers below min
    while (!primes.isEmpty() && primes.getFirst() < min) {
        primes.removeFirst();
    }

    return primes;
}
List<Integer> primes = findPrimes(10, 100);
System.out.println("Listing " + primes.size() + " prime numbers");
for (Integer prime : primes) {
    System.out.println(prime);
}