质数查找器
Prime numbers finder
所以我正在尝试使用 acm.utils 包中的 RandomGenerator class 找到从 0 到 n(用户输入)的随机素数的方法,出于某种原因它不起作用!我想了很多次,我认为这个解决方案是正确的,但它最终给出的数字没有错!
这是大学的一个项目,我只能使用 acm.util!没有扫描仪!只有这种代码
public int nextPrime(int n){
int num = rgen.nextInt(1, n);
boolean prime=false;
if (num==1){
return (num);
}else{
int i = 2;
int c = 0;
while ((i < num-1)&&(prime=false)){
if( (num % i) == 0){
c=c+1;
}
if((c==0)&&(i==(num-1))){
prime=true;
}
if(c>=1){
num = rgen.nextInt(1, n);
i=1;
}
i=i+1;
}
}
return (num);
}
=
用于赋值,==
用于比较。
你需要改变你的条件
while ((i < num-1)&&(prime=false)){
到
while ((i < num-1)&&(prime==false)){ or
while ((i < num-1)&&(!prime)){
您的代码相当奇怪。 c之类的变量不是很清楚,名字也帮不上忙
您可以阅读其他实现。
我做了一些更改以使其正常工作。痕迹也有帮助!
public static int nextPrime(int n)
{
int num = (int)(1+Math.random()*n); // other generator
// TRACE HERE
System.out.println("START:"+num);
boolean prime=false;
// CHANGE HERE
if (num==2)
{
return (num);
}
else
{
int i = 2;
int c = 0;
// CHANGE HERE
while ((i < num-1)&&(prime==false))
{
// Not prime => next one
if( (num % i) == 0)
{
// TRACE HERE
System.out.println("YOU LOSE: :"+num+" divided by "+i);
c=c+1;
}
if((c==0)&&(i==(num-1)))
{
prime=true;
// TRACE HERE
System.out.println("BINGO:"+num);
// CHANGE HERE
break;
}
if(c>=1)
{
// SAME PLAYER LOOP AGAIN
num = (int)(1+Math.random()*n);
// TRACE HERE
System.out.println("RESTART:"+num);
i=1;
// CHANGE HERE
c=0;
}
i=i+1;
}
}
return (num);
}
要么您错误地陈述了问题,要么您没有接近正确地编码问题。 10 以内的素数有 4 个:{2,3,5,7}。如果用户输入 10,你应该从这个集合中随机给出一个素数,还是随机给出前 10 个素数 {2,3,5,7,11,13,17,19,23,29} 中的一个?您说问题出在第一种解释(其中 11 不是对 10 的有效响应),但您尝试了第二种解释(其中 11 是对 10 的有效响应)。
例如,有一种简单的方法可以在 [1,1000000] 范围内的素数内均匀生成素数。在范围内选择一个随机整数并测试它是否为素数。如果是这样,return它。如果没有,请重复。这称为拒绝抽样。在不进行拒绝抽样的情况下,要得到一个均匀随机的素数是相当复杂的,因为在一个大范围内统计或列出素数并不容易。测试一个数是否为质数相对容易,对于 n>1,平均只需要大约 log n 个样本就可以在 [1,n].
中找到一个质数。
这是判断一个数是否为素数的基本方法。这种方法实际上只是为了理解查找数字是否为素数背后的逻辑。享受。
public boolean isPrime()
{
boolean prime = true;
for (int s = 2; s < original; s++)
if (original % s != 0 )
{
prime = true;
}
else
{
prime = false;
return prime;
}
return prime;
所以我正在尝试使用 acm.utils 包中的 RandomGenerator class 找到从 0 到 n(用户输入)的随机素数的方法,出于某种原因它不起作用!我想了很多次,我认为这个解决方案是正确的,但它最终给出的数字没有错!
这是大学的一个项目,我只能使用 acm.util!没有扫描仪!只有这种代码
public int nextPrime(int n){
int num = rgen.nextInt(1, n);
boolean prime=false;
if (num==1){
return (num);
}else{
int i = 2;
int c = 0;
while ((i < num-1)&&(prime=false)){
if( (num % i) == 0){
c=c+1;
}
if((c==0)&&(i==(num-1))){
prime=true;
}
if(c>=1){
num = rgen.nextInt(1, n);
i=1;
}
i=i+1;
}
}
return (num);
}
=
用于赋值,==
用于比较。
你需要改变你的条件
while ((i < num-1)&&(prime=false)){
到
while ((i < num-1)&&(prime==false)){ or
while ((i < num-1)&&(!prime)){
您的代码相当奇怪。 c之类的变量不是很清楚,名字也帮不上忙
您可以阅读其他实现。
我做了一些更改以使其正常工作。痕迹也有帮助!
public static int nextPrime(int n)
{
int num = (int)(1+Math.random()*n); // other generator
// TRACE HERE
System.out.println("START:"+num);
boolean prime=false;
// CHANGE HERE
if (num==2)
{
return (num);
}
else
{
int i = 2;
int c = 0;
// CHANGE HERE
while ((i < num-1)&&(prime==false))
{
// Not prime => next one
if( (num % i) == 0)
{
// TRACE HERE
System.out.println("YOU LOSE: :"+num+" divided by "+i);
c=c+1;
}
if((c==0)&&(i==(num-1)))
{
prime=true;
// TRACE HERE
System.out.println("BINGO:"+num);
// CHANGE HERE
break;
}
if(c>=1)
{
// SAME PLAYER LOOP AGAIN
num = (int)(1+Math.random()*n);
// TRACE HERE
System.out.println("RESTART:"+num);
i=1;
// CHANGE HERE
c=0;
}
i=i+1;
}
}
return (num);
}
要么您错误地陈述了问题,要么您没有接近正确地编码问题。 10 以内的素数有 4 个:{2,3,5,7}。如果用户输入 10,你应该从这个集合中随机给出一个素数,还是随机给出前 10 个素数 {2,3,5,7,11,13,17,19,23,29} 中的一个?您说问题出在第一种解释(其中 11 不是对 10 的有效响应),但您尝试了第二种解释(其中 11 是对 10 的有效响应)。
例如,有一种简单的方法可以在 [1,1000000] 范围内的素数内均匀生成素数。在范围内选择一个随机整数并测试它是否为素数。如果是这样,return它。如果没有,请重复。这称为拒绝抽样。在不进行拒绝抽样的情况下,要得到一个均匀随机的素数是相当复杂的,因为在一个大范围内统计或列出素数并不容易。测试一个数是否为质数相对容易,对于 n>1,平均只需要大约 log n 个样本就可以在 [1,n].
中找到一个质数。这是判断一个数是否为素数的基本方法。这种方法实际上只是为了理解查找数字是否为素数背后的逻辑。享受。
public boolean isPrime()
{
boolean prime = true;
for (int s = 2; s < original; s++)
if (original % s != 0 )
{
prime = true;
}
else
{
prime = false;
return prime;
}
return prime;