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

问题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. 深度学习框架caffe在ubuntu下的环境搭建

    深度学习实验室服务器系统配置手册 目录:     一,显卡安装     二,U盘启动盘制作     三,系统安装     四,系统的基本配置     五,安装Nvidia驱动     六,安装cuda ...

  2. Docker:unauthorized: incorrect username or password.

    用VS2017编译DockerCompose项目,显示错误:unauthorized: incorrect username or password. 打开命令行工具,输入docker login命令 ...

  3. Subsonic 介绍

    SubSonic:一个数据层构建器(BLL) 导言 一 个易维护的应用程序,不同的类之间有不同的分工,通常分为界面层.业务层和数据访问层.虽然这一技术有利于更好地组织应用,一些开发人员不愿这么做.创建 ...

  4. 4-[HTML]-body常用标签1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. UWP UserControl 不会自适应大小

    在一般的Page里面,我们通过VisualStateManager,可以根据窗体的宽度,来调整一些控件大小. <VisualStateManager.VisualStateGroups> ...

  6. h5小球走迷宫小游戏源码

    无意中找到的一个挺有意思的小游戏,关键是用h5写的,下面就分享给大家源码 还是先来看小游戏的截图 可以用键盘的三个键去控制它,然后通关 下面是源代码 <!doctype html> < ...

  7. 大神教你零基础学PS,30堂课从入门到精通

    ps视频教程,ps自学视频教程.ps免费视频教程下载,大神教你零基础学PS教程视频内容较大,分为俩部分: 大神教你零基础学PS--30堂课从入门到精通第一部分:百度网盘,https://pan.bai ...

  8. fiddler对安卓APP进行抓包

    操作流程: 1.fiddler导出ca证书 操作路径: Tools -> Fiddler Options -> HTTPS -> Export Fiddler Root Certif ...

  9. 文字排版 - bootStrap4常用CSS笔记

    [文字常用标签]   <h1>.<h2>.<h3>.<h4>.<h5>.<h6> 标题类标签,h1字体最大以次类推 <sm ...

  10. Spring Boot之拦截器与过滤器(完整版)

    作者:liuxiaopeng 链接:http://www.cnblogs.com/paddix 作者:蓝精灵lx原文:https://blog.csdn.net/liuxiao723846/artic ...