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);
}