阅读下面程序,请回答如下问题:

问题1:这个程序要找的是符合什么条件的数?

问题2:这样的数存在么?符合这一条件的最小的数是什么?

问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。

问题4:在多核电脑上如何提高这一程序的运行效率?

 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是有符号 64 位整数数据类型,表示值介于 -263到263之间的整数。这是一个非常大的数了,所以我们是不可能将程序手动执行完的,但我们仍然可以模拟前几次程序执行过程,来判断程序执行规律。

i=1

j = 0     hit=1     hit1=0    hit2=-1
j = 1     hit=2     hit1=0    hit2=1
j = 2     hit=3     hit1=0    hit2=1    break
比较   hit!=2

i=2

j = 0     hit=0    hit1=-1   hit2=-1
j = 1     hit=1    hit1=1    hit2=-1
j = 2     hit=2    hit1=1    hit2=2
j = 3     hit=3    hit1=1    hit2=2     break
比较   hit!=2

i=3

j = 0     hit=1    hit1=0    hit2=-1
j = 1     hit=1    hit1=0    hit2=-1
j = 2     hit=2    hit1=0    hit2=2
j = 3     hit=3    hit1=0    hit2=2     break
比较   hit!=2

i=4

j = 0     hit=0    hit1=-1   hit2=-1
j = 1     hit=1    hit1=1    hit2=-1
j = 2     hit=1    hit1=1    hit2=-1
j = 3     hit=2    hit1=1    hit2=3
j = 4     hit=3    hit1=1    hit2=3     break
比较   hit!=2

我们还可以继续运行下去,但是到这,我们不难发现对于程序输出条件 (hit == 2)&& (hit1+1==hit2) 中 hit1+1==hit 是要在 rg 数组中找到相邻的两个数,而 hit == 2 则要求这两个数可以同时被 i 整除。rg 中存储的是 2 ~ 31 。所以程序的最终目的是: 找出一个数 i,i 不能被 2~31 中相邻的两个数整除,但可以被其余28个数整除。

问题1:这个程序要找的是符合什么条件的数?

找出一个数 i,i 不能被 2~31 中相邻的两个数整除,但可以被其余28个数整除。

问题2:这样的数存在么?符合这一条件的最小的数是什么?

数学不好,全靠百度,我找到了这一个数:23*33*52*7*11*13*19*23*29*31=2123581660200;其实就是16,17与其它28个数的最小公倍数。

问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。

算不出来啊。。。。

算不出就实际测量一下吧。由于 263 相当于 1020,所以程序的最外层循环要执行 1020 次。太过庞大,我们取了 109 (1亿)次来进行估算,执行1亿次循环约需 6.82s 。所以大约需要 6.82 * 1011 s,大约是 11 483 000 000 分钟,约合 两万多天。

问题4:在多核电脑上如何提高这一程序的运行效率?

既然是多核电脑,应该可以用多线程的方式将程序分片并行执行,提高运行效率吧。

C#代码分析(第三周)的更多相关文章

  1. C#程序代码分析(第三周)

    刚开始看到这段程序,都不知道是什么东西,问过室友才知道是C#程序:但对C#一点都不了解,最基本的项目建设都不会,在室友的帮助下,以及在网上搜了一些资料,勉强算是完成了此次作业吧. using Syst ...

  2. linux内核分析第三周

    20135103王海宁 linux内核分析第三周 http://mooc.study.163.com/course/USTC-1000029000  按照课堂提供的方法,命令行一行行敲上去,我是手机缓 ...

  3. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  4. 20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 ...

  5. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  6. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  7. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  8. WebShell代码分析溯源(三)

    WebShell代码分析溯源(三) 一.一句话变形马样本 <?php $g = array('','s');$gg = a.$g[1].ser.chr('116');@$gg($_POST[ge ...

  9. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  10. 20135320赵瀚青LINUX内核分析第三周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...

随机推荐

  1. 2017-2018-2 《网络对抗技术》20155322 Exp7 网络欺诈防范

    [-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-简单应用SET工具建立冒名网站 2.2-ettercap DNS spoof 2.3 ...

  2. [2016北京集训试题15]项链-[FFT]

    Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...

  3. 将properties文件的配置设置为整个Web应用的全局变量。

    四种作用域: Web应用中的变量存放在不同的jsp对象中,会有不一样的作用域,四种不同的作用域排序是 pageContext < request < session < applic ...

  4. 【HNOI2015】亚瑟王

    题面 题解 考虑进行\(dp\). 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 我们可以知道第\(i\)张卡不被触发的概率为\((1 - p_i) ^ {r - j}\ ...

  5. P5231 [JSOI2012]玄武密码

    P5231 [JSOI2012]玄武密码 链接 分析: 首先对所有询问串建立AC自动机,然后扫描一遍母串,在AC自动机上走,没走到一个点,标记这个点走过了,并且它的fail树上的祖先节点也可以访问到( ...

  6. Spring Boot:项目打包成war并发布到Tomcat上运行

    一.修改pom文件 1. 因为SpringBoot中嵌入的有Tomcat,因此要移除嵌入式的Tomcat插件 <dependency> <groupId>org.springf ...

  7. Codeforces 914 C 数位DP+暴力打表+思维

    题意 给出一个二进制数\(n\),每次操作可以将一个整数\(x\)简化为\(x\)的二进制表示中\(1\)的个数,如果一个数简化为\(1\)所需的最小次数为\(k\),将这个数叫做特殊的数, 问从\( ...

  8. 实验二:ICMP重定向攻击

    -:实验原理 ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表.由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它 ...

  9. 菜鸟vimer成长记——第2.0章、模式初探

    首先,其他的文本编辑器只有一种模式,就是插入模式.而vim一下子颠覆了我们的世界观——有好多模式.这个是思维上的切换,很难也很重要!!! 其次,Vim 提供一个区分模式的用户界面.也就是说在不同的模式 ...

  10. 算法设计:UNION-FIND算法实现

    在上周的算法设计课程中,我们学习了UNION-FIND算法,该算法用来对不相交集进行查询与合并操作,但任何优秀的算法都必须要用实际的代码来进行实现,接下来我们就来看看具体的代码实现 1. 不相关集数据 ...