求質數,難以理解的代碼,有興趣可以看一下
求1.。x的質數?這樣的問題相信大家都很熟悉,我這里有兩個版本,其中有一點不太明白,希望大家指點一下。
一、簡單的版本
二、復雜但藝術的版本(write by Robert C. Martin)
問題:都用到了Math.sqrt(x),為什么用平方根,原理是什么呢?
一、簡單的版本
public static boolean isPrime(int x) {
boolean result = true;
int max = (int)Math.sqrt(x);
if(x == 0 || x == 1) {
result = false;
}
for(int i = 2; i <= max; i++) {
if(x % i == 0) {
result = false;
break;
}
}
return result;
}
二、復雜但藝術的版本(write by Robert C. Martin)
一、簡單的版本
二、復雜但藝術的版本(write by Robert C. Martin)
問題:都用到了Math.sqrt(x),為什么用平方根,原理是什么呢?
一、簡單的版本
















二、復雜但藝術的版本(write by Robert C. Martin)
1
public class PrimeGenerate1 {
2
private static boolean[] crossOut;
3
private static int[] result;
4
5
/**
6
* @param maxValue is the generation limit.
7
* @return int[]
8
*/
9
public static int[] generatePrime(int maxValue) {
10
if(maxValue < 2) {
11
return new int[0];
12
} else {
13
initializeArrayOfIntegers(maxValue);
14
crossOutMultiples();
15
putUncrossIntegerIntoResult();
16
iterateArray(result);
17
18
return result;
19
}
20
}
21
22
/**
23
* @param s
24
* @return
25
*/
26
private static void initializeArrayOfIntegers(int maxValue) {
27
crossOut = new boolean[maxValue + 1];
28
for (int i = 2; i < crossOut.length; i++)
29
crossOut[i] = false;
30
}
31
32
private static void crossOutMultiples() {
33
int maxPrimeFactor = calMaxPrimeFactor();
34
for (int i = 2;i <= maxPrimeFactor; i++) {
35
if(notCrossed(i))
36
crossOutMultiplesOf(i);
37
}
38
}
39
40
/**
41
* @param i
42
* @return
43
*/
44
private static boolean notCrossed(int i) {
45
return crossOut[i] == false;
46
}
47
48
/**
49
* @return
50
*/
51
private static int calMaxPrimeFactor() {
52
double maxPrimeFactor = Math.sqrt(crossOut.length);
53
return (int)maxPrimeFactor;
54
}
55
56
private static void putUncrossIntegerIntoResult() {
57
result = new int[numberOfUncrossedIntegers()];
58
for(int i = 2, j = 0; i < crossOut.length; i++) {
59
if(notCrossed(i))
60
result[j++] = i;
61
}
62
}
63
64
/**
65
* @param count
66
* @return
67
*/
68
private static int numberOfUncrossedIntegers() {
69
int count = 0;
70
for (int i = 2; i < crossOut.length; i++) {
71
if(notCrossed(i)) {
72
count++;
73
}
74
}
75
return count;
76
}
77
78
private static void iterateArray(int[] array) {
79
if(array.length != 0) {
80
for(int i : array) {
81
System.out.print(i + " ");
82
}
83
System.out.println();
84
}
85
}
86
87
private static void crossOutMultiplesOf(int i) {
88
for (int multiple = 2 * i; multiple < crossOut.length; multiple += i) {
89
crossOut[multiple] = true;
90
}
91
}
92
93
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

posted on 2012-04-12 16:21 zhb8015 閱讀(433) 評論(1) 編輯 收藏 所屬分類: interview