这是我们老大培训第一天的作业,今后几乎左右的作业都会记录在这。
2014-07-07
要求:
C#基本语法实现 九九乘法表 和1000以内所有质数
几个新手同事,有刚毕业的学生,有做机电出身,也有硬件做硬件的。
大家可能想法不一,所以集思广益,对于好的思路,我这里借鉴并留存。
大铿的代码:
1 //求 千以内的素数 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace sushu 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 DateTime d1 = System.DateTime.Now; //运行的当前时间 15 Console.WriteLine("开始时间是:{0}", d1); 16 Console.WriteLine(); 17 18 int n = 10000; //定义范围 19 int m = 0; 20 bool t=false; //定义因数存在变量,初始为false 21 int count = 0; //统计个数的变量 22 23 for (int i = 1; i <= n; i++) 24 { 25 if (i == 2 || i == 3) //处理 2 3 26 { 27 count = count + 1; 28 Console.Write("{0} ", i); 29 } 30 31 if(i%2!=0) //排除偶数 32 { 33 34 for (int a = 2; a <= i/2; a++) //处理除 1 以外的因数(如果存在因数,必然会存在一个小于n/2因数) 35 { 36 t = false; 37 m = i % a; 38 if (m == 0) 39 break; //整除退出循环 40 else 41 t = true; //关键标识 42 } 43 44 if (t == true) //判断质数,然后输出,统计个数 45 { 46 count = count + 1; 47 Console.Write("{0} ", i); 48 if (count%12==0) //输出数字排版 12列 49 { 50 Console.WriteLine(); 51 } 52 } 53 54 } 55 56 } 57 Console.WriteLine(); 58 Console.WriteLine("{0}以内的质数个数总数是: {1}", n, count); //输出质数统计 59 Console.WriteLine(); 60 TimeSpan ts = DateTime.Now - d1; //获取当前时间并计算耗时 61 Console.WriteLine("耗时:{0}秒,{1}毫秒",ts.Seconds,ts.Milliseconds); //输出耗时数据 62 63 64 Console.ReadKey(); 65 66 } 67 } 68 }
老大点评:(这里仅仅按照我当时所理解去记录,原话已经记不太清了)
其优点在于尽量减少循环次数,排除一定的非质数。
小勇的代码:
1 static void Main(string[] args) 2 3 { 4 5 int i=0, j = 0; 6 for (i = 3; i <= 10000; i = i + 2)//i+2 把偶素去掉,减少运算量 7 { 8 // 再次减少运算量,合素分解,必有其最小因数小于或等于合数的开根号 9 int k = (int)Math.Sqrt(i); 10 for (j = 2; j <= k; j++) 11 { 12 //判断素数 13 if ((i % j) == 0) 14 { 15 break; 16 } 17 } 18 //如果j<k,说明没有判断完,送回去再判断 19 if (j > k) 20 { 21 Console.Write(i.ToString() + " "); 22 } 23 } 24 Console.Read(); 25 26 }
这里用了 一个数学方法 (开方):
1 int k = (int)Math.Sqrt(i);
问过老大这个运行起来的效率,得到的回复是这个函数 运用的是中国古代一种很牛X的算法(具体不记得),但是速度是最慢的。