在不使用循环和突变的情况下确定数字是否为素数?

时间:2015-01-28 09:33:04

标签: c

如何在不使用循环的情况下确定数字是否为素数?我是一名初学者,到目前为止我只被教过功能性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) {
    ...
}

我正在考虑一种递归方法,但我无法弄明白。 效率也不是这个问题中要考虑的因素。 任何帮助将不胜感激,谢谢!

4 个答案:

答案 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)

已知存在用于确定否的随机化算法。是否为素数( 最有可能只使用单个输入 (我没有关于所有此类算法的idead),即数字本身将被测试其素性)。事实证明,这些算法在 最大 no时是准确的。一些情况,即,他们能够给出正确结果的概率非常高(尽管不像编写的通常的确定性算法那样100%)。如果您愿意,可以使用它们。

有关详细信息,请参阅以下链接:
http://en.wikipedia.org/wiki/Primality_test#Probabilistic_tests