我正在“Java如何编程”一书中进行练习。练习要我写一个方法来确定一个数字是否是“素数”。 (“素数”是一个正整数,只能用自身和1)分割。然后我应该在一个应用程序中实现该方法,该应用程序显示最多10 000的所有整数。 我使用“双值”来测试余数是否为0,以测试可分割性。 无论如何,我只是没有让程序工作,它显示3的所有数字,并显示每个数字显示的次数(3 44 555等)。谁能告诉我我做错了什么?
代码如下:
public class Oppgave625
{
public static void main(String[] args)
{
for(double a = 2; a <= 10000; a++)
{
for(double b = 1; b < a; b++)
{
if (prime(a, b) !=0)
{
System.out.printf("%.0f ", prime(a, b));
}
}
}
}
static double prime(double x, double y)
{
if (x % y != 0)
{
return x;
}
else
{
return 0;
}
}
}
答案 0 :(得分:3)
使用int代替。双重不利于此目的
您可能需要阅读this article以了解%运算符对浮点数的使用。
答案 1 :(得分:1)
您为此发布了示例代码,这很棒,但有几件事情是错误的:
你不应该为此使用浮点类型,而是使用int或long。永远不要将浮点类型用于精确值。
你正在两次调用你的素数函数,有效地将所需步骤加倍
你的素数函数只告诉你两个数字是否均匀分配,它不会告诉你一个是否是素数
对于素数,您应该使用更有效的算法,而不是为每个数字反复计算相同的值。查看Sieve of Eratosthenes。
答案 2 :(得分:1)
实际上,这里有很多个别错误。我将prime()
函数简化为仅仅是模运算的点,因此我能够内联它。其次,我将测试反转,以便检查不有余数的数字,并在找到除数后立即继续下一个数字。第三,我更改了b = 1
,以便我们不检查可被1整除的数字,因为这会导致所有数字。最后,我仅打印出我们不发现除数的数字。最终结果:
public static void main(String[] args) {
outer:
for (int a = 2; a <= 1000; a++) {
for (int b = 2; b < a; b++) {
if (a % b == 0) {
continue outer;
}
}
System.out.println(a);
}
}
编辑:我忘了提及,我也将类型从浮动更改为整数,因为我确定这就是你的意思。
答案 3 :(得分:0)
你正在接近这样的问题:数字A不是素数,只要我能找到一个可以在没有余数的情况下划分A的数字B. Bur现在,只要B不可分割就打印出A.
相反你可以说:每当A不能被B整除时,增加B.当我发现B除以A时,退出内循环,不打印任何东西。 当我没有找到B时,打印A并退出循环。
此外,您只需要测试A的可分性,直到(a / 2)-1。
答案 4 :(得分:0)
素数是一个只能被1和它自身整除的数字。那是:一个数字。您的代码正在比较欧几里德算法中的两个数字,以便对coprime-ness进行测试。这与测试数字是否为prime非常不同。
您的代码应如下所示:
for i = 2 to 10,000 {
if( isPrime(i) ){
print i
}
}
function isPrime( int n ){
for i = 2 to n {
next if i == n
if( n % i == 0 ){
return 0;
}
}
return 1;
}
答案 5 :(得分:0)
boolean isPrime = true;
for (int i = 2; i<=100; i++){
for(int j = 2; j<=i/2; j++){
isPrime = true;
if (i%j==0){
isPrime = false;
break;
}
}
if (isPrime){
Log.d("PrimeNumber",""+i);
}
}