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 * ****/