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

问题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. [控件] Firemonkey 跨平台 Toast

    控件说明:一个简单的讯息提示功能,使用 FMX 基本控件,因此支持 Win, macOS, iOS, Android 平台. 已知问题:如果使用了 WebBrowser, MapView... 等原生 ...

  2. 浅析 golang interface 实现原理

    interface 在 golang 中是一个非常重要的特性.它相对于其它语言有很多优势: duck typing.大多数的静态语言需要显示的声明类型的继承关系.而 golang 通过 interfa ...

  3. HTTP性能测试工具wrk安装及使用

    wrk 是一个很简单的 http 性能测试工具,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于HTTP性能测试工具,但是比 ab 功能更加强大,并且可以支持l ...

  4. JavaScript总结(二)

    JavaScript的数据类型 ✍ 原始数据类型值: JavaScript有5中原始数据类型,通过调用typeof运算符返回值查看变量类型: ➣ Undefined ➔ 'undefined': Un ...

  5. c++ 条件判断

    if语句 认识算术比较 运算符表达式用法 关系运算符表达式 一. 基本的if语句 if (条件成立) { 则执行此语句 }; // ) printf("条件成立"); 二.认识算术 ...

  6. Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)

    1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...

  7. AngularJS 从DOM中获取scope

    节选官方文档: 原文:https://docs.angularjs.org/guide/scope scope是附加在DOM上,使用了ng-app指令的DOM就是root scope.一般是<h ...

  8. Codeforces 912 D. Fishes (贪心、bfs)

    题目链接:Fishes 题意: 有一个n×m的鱼塘,有一张r×r的渔网,现在往池塘里面放k条鱼(每个格子只能放一条鱼), 现在撒网的地方是随机的(必须在池塘内),问能捕的鱼的期望值最大是多少? 题解: ...

  9. vs2012调试时,抛出异常的等待时间很慢,原来是QQ电脑管家搞的鬼。

    vs2012调试时,抛出异常的等待时间以前都正常,不知什么时候起变得很慢,就是出错以后要等30秒以上才会提示,一直找不到原因. 今天看了一下任务管理器,发现有个QQpcrTP进程(好像是,因为卸载了) ...

  10. 「专题训练」Collecting Bugs(POJ-2096)

    题意与分析 题意大致是这样的:给定一个\(n\times s\)的矩阵,每次可以随机的在这个矩阵内给一个格子染色(染过色的仍然可能被选中),问每一行和每一列都有格子被染色的次数的期望. 这题如果从概率 ...