1 /************************************* 2 * 3 * 20180127凌晨0:45 4 * 5 * 太冷了最近 ,晚上睡不着覺,做做題目吧 6 * 7 * 找到100以內的所有素數(質數) 8 * 9 * 10 * 11 * 12 * 先來看下質數的定義:只有1和它本身兩個因數的自然數 13 * 14 * 如果將所有質數從小到大依次排列,那么根據定義就可以知道2是第一個質數 15 * 16 * 我們將從小到大依次排列所有質數的集合記為 集合 A = {2,,......} 17 * 18 * 集合 A 里面元素的個數為 N,因為有無限個質數,毫無疑問 N 的值也無窮大 19 * 20 * 現在我們已經知道了1個A集合中的元素 A[0]=2 ,我們把已經找到的素數個數記為 n+1,目前 n=0 21 * 22 * 23 * 24 * 無限的東西,我們的計算機無法再有限的時間里面對其進行計算 25 * 26 * 因此,我們把給要解決的問題一些約束條件:找到 m 及以內的所有素數, 27 * 28 * m為不小於2的自然數,此處暫定 m = 100。 29 * 30 * 31 * 現在我們已經把所有信息抽象化進行定義了,我們重新來梳理一遍所有定義 32 * 33 * A :從小到大依次排列所有質數的集合 34 * 35 * A[0] : A集合中第一個元素的值,A[0]=2 36 * 37 * n+1 :已經知道了A集合中的元素的個數,n初始時值為0 38 * 39 * m :值為100 40 * 41 * i : 變量, i 的區間為 [2,m] 42 * 43 * j : 變量, j的區間范圍為 [0,n) 44 * 45 * 46 * 所有數學問題,都是可以被抽象化定義的,其次是可被計算的 47 * 48 * 接下來我們看想計算方法 49 * 50 * 根據質數的性質,我們可以有以下推論:如果一個數不能被它之前的任何質數整除,那么它自己也是一個質數 51 * 52 * 換句話說,一個數能被它之前的任何質數整除,那么它就不是質數,不能被它之前的任何質數整除的數是質數 53 * 54 * 因此 我們只要將當前自然數 i 與小於它 的 所有已知的 n 個質數整除便可判定 55 * 56 * 57 * 58 * 59 ************************************/ 60 61 62 int[] A = new int[100]; //質數集合 63 A[0] = 2; 64 int n = 0; 65 int m = 100; 66 int i, j; 67 68 Console.WriteLine("{0}", A[n]); //輸出第一個質數 69 70 i = 3; 71 while (i <= m) 72 { 73 j = 0; 74 while (j <= n) 75 { 76 if (i % A[j] == 0) 77 { 78 //一個數能被它之前的任何質數整除,那么它就不是質數 79 break; 80 } 81 else 82 { 83 //與下一個素數除余 84 j++; 85 86 if (j > n) 87 { 88 //不能被它之前的任何質數整除的數是質數 89 n++; 90 A[n] = i; 91 Console.WriteLine("{0}", A[n]); 92 } 93 } 94 } 95 i++; 96 } 97 98 99 100 101 102 Console.ReadKey(); 103 104 /**** 105 * 20180126 凌晨1:56 106 * 107 * 寫完了,睡覺 108 * 109 * 110 * ****/