C#代码分析(第三周)

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

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

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

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

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

 1 using System;
 2
 3 using System.Collections.Generic;
 4
 5 using System.Text;
 6
 7 namespace FindTheNumber
 8
 9 {
10   class Program
11   {
12     static void Main(string[] args)
13     {
14       int [] rg =
15           {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
16            20,21,22,23,24,25,26,27,28,29,30,31};
17       for (Int64 i = 1; i < Int64.MaxValue; i++)
18       {
19         int hit = 0;
20         int hit1 = -1;
21         int hit2 = -1;
22         for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)
23         {
24           if ((i % rg[j]) != 0)
25           {
26             hit++;
27             if (hit == 1)
28             {
29               hit1 = j;
30             }
31             else if (hit == 2)
32             {
33               hit2 = j;
34             }
35             else
36               break;
37           }
38
39         }
40         if ((hit == 2)&& (hit1+1==hit2))
41         {
42           Console.WriteLine("found {0}", i);
43         }
44       }
45     }
46   }
47 }

代码分析

我每次分析代码时,基本都是将程序的执行过程写下来,当然,对程序执行单步调试也是好办法。慢慢的发现程序的执行规律,判断代码要完成的功能。在本程序中,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,内存和硬盘等资源充足)。

算不出来啊。。。。

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

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

时间: 2024-12-11 22:41:46

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

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

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

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

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 回顾: [计算机三个法宝] 1)存储程序计算机 2)函数调用堆栈 3)中断 [操作系统两把宝剑] 1)中断上下文的切换:保存现场和恢复现场 2)进程上下文的切换 一.使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开

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

第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 一.阅读Linux内核代码 本周我们要学习如何阅读Linux内核源代码,首先打开Lstest Stable Kernel:linux-3.18.6 arch/目录在Linux内核中占有相当庞大的代码量,因为Linux支持很多CPU,这个arch/x86目录下的代码是我们重要关注的代码 根目录中比较关

Linux内核及分析 第三周 Linux内核的启动过程

实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输出Linux内核启动信息,启动成功后显示Menuos 输入help,提示该精简的系统支持三个命令:help.version.quit 使用gdb跟踪调试内核 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel li

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

HEVC码率控制算法研究与HM相应代码分析(三)——算法及代码分析

在前两篇文章中,首先介绍了HEVC标准和编码流程,然后介绍了在HEVC中采用的全新的R-λ模型,本文将基于前面的内容和相应代码对码率控制算法进行详细的分析. 下面基于JCTVC-K0103提案详细介绍一下HEVC中基于R-λ模型的码率控制方法.同时基于HM-10对码率控制部分的代码做一个简要分析,相比于JM,HM中更多的使用了面向对象技术,结构更加清楚明了,码率控制相关代码的基本调用层次如下,纵向上即层层调用的关系,横向上是对几个比较重要的函数的内部调用情况列了出来. 跟以前的方法类似,码率控制

Ocata Neutron代码分析(三)——oslo_service中的ServiceLauncher和ProcessLauncher(转载)

1.概述 Openstack中有一个叫Launcher的概念,即专门用来启动服务的,这个类被放在了oslo_service这个包里面.Launcher分为两种,一种是ServiceLauncher,另一种为ProcessLauncher.ServiceLauncher用来启动单进程的服务,而ProcessLauncher用来启动有多个worker子进程的服务. 2.ServiceLauncher ServiceLauncher继承自Launcher,启动服务的一个重要成员就是launcher_s

魏昊卿——《Linux内核分析》第三周作业:Linux系统启动过程

魏昊卿——<Linux内核分析>第三周作业:Linux系统启动过程 一.实验部分 实验指导 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>

20145331 《信息安全系统设计基础》第5周学习实践部分总结及代码分析

第三章实践内容及代码分析: 一.过程截图: 反汇编:objdump -d wsc.o 一.建立wsc1.c的c文件,并转成汇编代码: wsc.c: wsc.o:(查看用od xxx) 二.输入命令,得到二进制格式代码,并输入od wsc.o进行查看: 三.反汇编:objdump -d wsc.o,得到反汇编代码: 四.反汇编代码分析: 1.反汇编代码和一般汇编代码相比操作指令后面没有后缀. 2.代码分析:代码逻辑是g函数调用f函数,main函数调用g函数,以第一个为例,通过代码对栈帧进行分析: