如何在不使用循环的情况下确定数字是否为素数?我是一名初学者,到目前为止我只被教过功能性C.我被允许使用的是最基本的代码,如+ - ,if,==,!,|| ....此外,没有变量允许突变,所有变量必须是常数。
这是我的变异代码:
bool prime(const int i, int a) {
if (a > i/2){
return false;
}
if (i%a == 0){
return true;
}
else {
return prime(i, a+1);
}
}
# int a is a counter its given initial value is always 2
#prime (5,2) --> false
#prime (9,2) --> true
然而,正如问题所要求的那样,不允许任何变异,只消耗一个变量,因此看起来应该是
bool prime(const int i) {
...
}
我正在考虑一种递归方法,但我无法弄明白。 效率也不是这个问题中要考虑的因素。 任何帮助将不胜感激,谢谢!
答案 0 :(得分:2)
使用辅助功能它应该或多或少容易,虽然可怕的效率不高:
bool prime(const int i)
{
prime_aux(i, i-1);
}
bool prime_aux(const int i, const int d)
{
if (d == 1) return true;
if (i % d == 0) return false;
return prime_aux(i, d - 1);
}
有一些简单的优化,但我省略了它们,因为代码更漂亮。在继续之前,可能还需要对输入参数进行一些检查。
答案 1 :(得分:1)
我能想到的只有:
bool prime(const int i)
{
assert(i >= 0);
return char_array_odd_primes_const[i / 8] & (1U << (i % 8)) ? true : false;
}
其中char_array_primes_const
包含2个 31 位,对于素数设置为1,对于非素数设置为0。
效率更高:
bool prime(const int i)
{
assert(i >= 0);
if(2 == i) return true;
if(i % 2) return false;
return char_array_primes_const[i / 16] & (1U << ((i/2) % 8)) ? true : false;
}
答案 2 :(得分:1)
check a given number prime or not without loop,Recursion,Auxiliary Function
import java.math.RoundingMode;
import java.util.Scanner;
public class PrimeNumberwithoutloop {
static void PrimeNumber(double num)
{
double n=num/6;
if(n<Math.round(n))
{ n=6*(Math.round(n))-1;
if(n==num)
System.out.println("Prime");
else
System.out.println("Not Prime");
}
else
{ n=6*(Math.round(n))+1;
if(n==num)
System.out.println("Prime");
else
System.out.println("Not Prime");
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("Enter number to check prime or not");
double num=sc.nextDouble();
PrimeNumber(num);
}
}
答案 3 :(得分:0)
有关详细信息,请参阅以下链接:
http://en.wikipedia.org/wiki/Primality_test#Probabilistic_tests