读C#程序(第三周)
阅读下面程序,请回答如下问题:
问题1:这个程序要找的是符合什么条件的数?
问题2:这样的数存在么?符合这一条件的最小的数是什么?
问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。
问题4:在多核电脑上如何提高这一程序的运行效率?
(注:该程序、用C#语言编写,但是只要有C语言基础完全没有阅读压力,如果对部分语句不懂请自行查询)
要求:将上述问题结果写到博客上。
using System; using System.Collections.Generic; using System.Text; namespace FindTheNumber {
class Program
{
static void Main(string[] args)
{
int [] rg =
{,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,};
for (Int64 i = ; i < Int64.MaxValue; i++)
{
int hit = ;
int hit1 = -;
int hit2 = -;
for (int j = ; (j < rg.Length) && (hit <=) ; j++)
{
if ((i % rg[j]) != )
{
hit++;
if (hit == )
{
hit1 = j;
}
else if (hit == )
{
hit2 = j;
}
else
break;
} }
if ((hit == )&& (hit1+==hit2))
{
Console.WriteLine("found {0}", i);
}
}
}
}
}
代码分析:
最初读这个程序的时候不知道Int64的数据范围,谷歌之后范围是-9223372036854775808~+9223372036854775807,
而Int64.MaxValue=+9223372036854775807,程序定义了一个整形数组int [] rg ={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};作为数表。变量i属于[1,9223372036854775807],然后一看这个数这么大,然后直接就把程序给拿去运行了,,,,,然后等了N久,从我早上起床打开电脑,一直运行到我中午回寝室都没出结果。。。。然后我心灰意冷了,决定还是认真用头运行程序吧。。。。。所以目测结果是这样的。。
i | j | hit | hit1 | hit2 | hit==2&&hit1+1==hit2 |
1 | 0 | 1 | 0 | -1 | |
1 | 2 | 0 | 1 | ||
2 | 3 | 0 | 1 | hit!=2,hit1+1==hit2 | |
2 | 0 | 0 | -1 | -1 | |
1 | 1 | 1 | -1 | ||
2 | 2 | 1 | 2 | ||
3 | 3 | 1 | 2 | hit!=2,hit1+1==hit2 | |
3 | 0 | 1 | 0 | -1 | |
1 | 1 | 0 | -1 | ||
2 | 2 | 0 | 2 | ||
3 | 3 | 0 | -2 | hit!=2,hit1+1!=hit2 | |
.......... | .......... | ............. | .......... | ........... | ................ |
更多的就不写了,当我运算到i=5的时候就发现了,
问题1:这个程序要找的是在区间[1,9223372036854775807]内的数,不能被数表rg[]中相邻的两个数整除,但可以被其它28个数整除;
问题2:,,,看见数字这么大,我已经崩溃了,然后谷歌是万能的,得出答案就是16,,17与剩下28个数的最小公倍数答案就是:2123581660200。
问题3:反正我是真的自己运行了,但是没出结果,i要循环2123581660200次,j是根据i为奇偶数而定的,估计10次左右,其他的就不知道了。。
问题4:多核电脑的运行怎么才能提高,作为计算机的学生,说实话我是失败的,对于这些基本的硬件知识我是属于二白的,尽管已经学过计算机组成原理,但好像从讲课开始,都没提到这些东西,然后自己也搜过这些知识,但是总是记不住,,所以就百度找到了一些,也不知道具体能不能行。。http://zhidao.baidu.com/link?url=CvTVizCqNEgtrBOR6CfMGAnncRyKZeI1E29WDiCB_gJN6khwm0lbvuBgnOZNCRE85eBzPCb-ZVeLYY6VCHbWCq
经过这么长时间,看过别人的博客,对于之前的一些问题的补充,看懂了的是别人的,只有自己做过写过才会可能变成自己的,之所以这么久才补充,原因就不提了,
>>>>>对于问题2:曹新宇同学讲解的非常清楚,这是他的博客地址http://www.cnblogs.com/duasonir/p/5301328.html
排除法:在2到31这些数当中,质数有2 3 5 7 11 13 17 19 23 29 31,任意一个大于1的非质数都可以分解成几个数的乘积,而在2-31这些数当中,有很多数都是可以被分解的,比如16=2*2*2*2 , 27=3*3*3 , 25=5*5,2的5次方、3的4次方、5的3次方、7的平方已经超出了31,所以在2-31中,2最大取到4次方,3取到3次方,5取到2次方,7为1次方,而像4,6,8,9,10,12,14,15,18,20,21,22,24,26,28,30都可以被2,3,5当中的数整除,也就相当于没有意义,就剩下核心数7 11 13 16 17 19 23 25 27 29 31,这些数的乘积可以被2-31任意的数整除,我们需要找的数相邻的两个数,只有16,17了,所以8*27*25*7*11*13*1*19*23*29*31=2123581660200,当然这只是最小的数。
>>>>>对于问题3:薛鹏飞同学讲解的让我更容易明白、更支持:http://www.cnblogs.com/yzdd/p/5283887.html
单核CPU4.0G HZ 执行速度为4*10^9/s。(2)外层循环2123581660200次(已最小的数为准)。(3)执行一次%操作用80个CPU周期(http://blog.sina.com.cn/s/blog_65ba9a5e0102v2ih.html)。(4)内层循环次数取决于i,i奇数5次(不能整除2,4),i偶数估计最多执行15次,(方法类似于附录一 2)平均8次。因为i连续增长即i 奇偶交替,所以两种情况取平均值再加上其他判断和赋值语句,得出内层循环次数约为80*(7+5)=960次。(5)总次数=外层*内层(6)执行时间=总次数/每秒执行速度*60=8500min
>>>>>>对于问题4:基本上都是说的优化代码、利用多线程分块执行程序、减少运行程序的数量等等。
读C#程序(第三周)的更多相关文章
- 20155203 2016-2017-3 《Java程序设计》第三周学习总结
20155203 2016-2017-3 <Java程序设计>第三周学习总结 教材知识要点总结 第四章 文档主文档名必须与公开类名称相同.一个原始码中可以定义多个类,但是只能有一个公开类. ...
- 程序语言与编程实践7-> Java实操4 | 第三周作业及思路讲解 | 异常处理考察
第三周作业,可能是异常那一章当时没怎么听,此前也不怎么接触,感觉还挺陌生的. 00 第1题 00-1 题目 /* * To change this license header, choose Lic ...
- 1903021121—刘明伟—Java第三周作业—学习在eclipse上创建并运行java程序
项目 内容 课程班级博客链接 19信计班(本) 作业要求链接 第三周作业 作业要求 每道题要有题目,代码,截图 扩展阅读 eclipse如何创建java程序 java语言基础(上) 扩展阅读心得: 想 ...
- 20175202 《Java程序设计》第三周学习总结
20175209 2018-2019-2 <Java程序设计>第三周学习总结 教材知识点总结 1.编程语言发展阶段: 面向机器语言——面向过程语言——面向对象语言. 2.类声明: 类名必须 ...
- 20175317 《Java程序设计》第三周学习总结
20175317 <Java程序设计>第三周学习总结 教材学习内容总结 第三周我学习了教材第四章的内容,了解了Java中的部分常用语句,学到了以下内容: 明白了什么是类,成员变量有哪些,什 ...
- 杨其菊201771010134《面向对象程序设计(Java)》第三周学习总结
<面向对象程序设计(Java)>第三周学习总结 第一部分:理论知识 这周课程没有新进度,由于感觉对基础语法的不熟悉,复习了一遍前三章的细碎知识,学到一些之前不知道的原理: 1.计算机高级语 ...
- JAVA 第三周学习总结
20175308 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 本周的学习内容为整个第四章的内容,学习中感觉知识点既多又杂,故在总结时尽量选用重要的或高度概 ...
- 20145312 《Java程序设计》第三周学习总结
20145312 <Java程序设计>第三周学习总结 学习笔记 Chapter 4 4.1类与对象 4.1.1 定义类 1.以服饰设计为例,类定义用class关键词,建立衣服实例要用new ...
- 20144303 《Java程序设计》第三周学习总结
20144303 <Java程序设计>第三周学习总结 教材学习内容总结 •对象是存在的具体实体,具有明确的状态和行为,类是具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属 ...
随机推荐
- 如何弹出QQ临时对话框实现不添加好友在线交谈效果
如何不添加好友弹出QQ临时对话框实现在线交谈效果,这样的一个需求,我们真的是太需要了,实现起来也很简单,一行代码即可搞定,需要的朋友可以参考下 其实这个很简单,在img我们加入一个a标签,然后 < ...
- Oracle_spatial的常见错误与注意事项
常见的错误 1.ORA-13226:没有空间索引接口将不被支持 当使用一个空间操作符时,如果没有使用空间索引导致该操作符不能被完成将会返回该错误.这可能会发生在当你使用的列上没有空间索引.或者优化器没 ...
- 两个docker容器互连时,提示no route to host错误的问题
大家都知道,两个docker container互连的时候可以用link,但是,我们也知道,container可以将自己的端口映射到宿主机上,比如一个container A上的tomcat将端口暴露给 ...
- PAT B1035 插入与归并 (25 分)
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...
- java.lang.RuntimeException: Fail to connect to camera service
玩自定义照相机的时候出现了:java.lang.RuntimeException: Fail to connect to camera service 讲过百度和Google后知道是权限少加了.(试验 ...
- FPGA按一下按键,对应端口输出单个脉冲
对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state(key,led,clk); input ...
- TortoiseSVN 只取下或更新部分文件的方法(Sparse Update/Sparse Checkout)
Sparse Update/Sparse Checkout To easily select only the items you want for the checkout and force ...
- VBA删除 语法
Option Explicit '清空数据 Private Sub CommandButton1_Click() Dim qknum As Integer '选择是或者否 来确认删除数据 '中对话 ...
- Android下so注入汇总
/** 作者:蟑螂一号* 原文链接:http://www.sanwho.com/133.html* 转载请注明出处*/ Android下so注入是基于ptrace系统调用,因此要想学会andro ...
- WFP loading 窗口显示 SplashScreen
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { Spl ...