如何查找给定数字是否为复合数字

时间:2010-11-24 03:37:13

标签: java math

如何识别给定号码是否为composite号码?

4 个答案:

答案 0 :(得分:11)

检查它是否可以被2和数字的平方根之间的任何数字整除,包括在内。

答案 1 :(得分:2)

我会选择Ignacio的解决方案,但如果你想让它更有效率(相对于时间,以一点点空间为代价),你可以除以所有 primes 2和n的平方根。

那是因为,如果一个数字不能被2整除,那么就没有必要检查它是否可以被4或6或8整除(依此类推)。

对于32位有符号数,最高(2147483647)的平方根为46341(向上舍入)。

46341 2 是2147488281。

由于只有大约4800个质数小于或等于46341,因此使用筛子预先生成它们并使用这些预先生成的值是一件简单的事情。后面的完整程序包含一个函数,它返回复合的第一个素数因子或者返回素数的-1。程序本身列出了大于1的所有32位数字及其素数/复合状态和因子:

public class testprog {
    private static int[] primes = new int[] {
           2,    3,    5,    7,   11,   13,   17,   19,   23,   29,
          31,   37,   41,   43,   47,   53,   59,   61,   67,   71,
          73,   79,   83,   89,   97,  101,  103,  107,  109,  113,
         127,  131,  137,  139,  149,  151,  157,  163,  167,  173,
         179,  181,  191,  193,  197,  199,  211,  223,  227,  229,

       // : : : : :
       // Full list removed due to SO size limits.
       // You can get a full list from a sieve or off the net.
       // : : : : :

       45863,45869,45887,45893,45943,45949,45953,45959,45971,45979,
       45989,46021,46027,46049,46051,46061,46073,46091,46093,46099,
       46103,46133,46141,46147,46153,46171,46181,46183,46187,46199,
       46219,46229,46237,46261,46271,46273,46279,46301,46307,46309,
       46327,46337
    };

    private static int getFactor (int val) {
        for (int i = 0; i < primes.length; i++) {
            if (primes[i] * primes[i] > val) {
                return -1;
            }
            if ((val / primes[i]) * primes[i] == val) {
                return primes[i];
            }
        }
        return -1;
    }
    public static void main(String args[]) {
        for (int i = 2; i < 2147483647; i++) {
            int val = i;
            int factor = getFactor (val);
            System.out.print ("Factors of " + val + " are:");
            while (factor != -1) {
                System .out.print (" " + factor);
                val = val / factor;
                factor = getFactor (val);
            }
            if (val == i)
                System .out.println (" " + val + " (prime)");
            else
                System .out.println (" " + val + " (composite)");
        }
    }
}

答案 2 :(得分:2)

由于您使用的是Java,最简单的选择就是调用BigInteger.isProbablePrime(),例如BigInteger.valueOf(2147488279L).isProbablePrime()

答案 3 :(得分:0)

复合表示该数字不是素数。 一段时间后很难找到素数,但任何2美元... sqrt(n)$的倍数都可以是综合数字的一个因子。大于此范围是不可能的,因为最高因子是$ sqrt(n)$。

听起来你只是不明白复合材料是什么意思?

如果您不太了解编程(因为您的问题不清楚),您可以使用循环:

1 public class CompositeCheck {
2 
3   public static void main (String args[]) {
4       int number = 561;
5       System.out.print(isComposite(number));
6   }
7   
8   public static boolean isComposite(int number) {
9       int i;
10      for (i = 2; i< Math.sqrt(number); ++i){
11          if (number/i == Math.floor(number/i)) {
12              return true;
13          }
14      }
15  return false;
16  }

“技巧”是通过除法并将其与向下舍入的版本(第11行)进行比较

如果这是作业,你应该把它作为“家庭作业”,并以正确的方式寻求帮助。