zoukankan      html  css  js  c++  java
  • 第三周 分析程序题

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

    以上是所给的源代码

    一.这个程序要找的是符合什么条件的数?

          该题目所要找的是不能整除2至31的相邻两个数却能整除其他所有数的数。注:由其中的for循环不难看出这段程序的真正目的。

    二.这样的数存在么?符合这一条件的最小的数是什么?

          这样的数存在。

          First,对于2至31这30个数,我们可以先将其分为两组。第一组,2至15,因为2至15的2倍均在16至30中,能整除大的数据一定可以整除她的因子,故,我们找最小的符合条件的数据,就应在15至31中去除最小的两个相邻的数,即16和17.

          Second,我们将每一个数都拆分成最小的因子相乘,例,8=2*2*2,9=3*3等等,要得到最小的满足条件的数据,则应使用最少的因子,将所有的数据组合起来。如,8=2*4,2和4就不需要了。在上面的程序中,只要i能整除8,就能整除2和4.

          Last,最后就是要讨论不能被16,17整除的问题了,第二部将所有的因子都列出来,要得到8,至少要3个2,要得到27至少要3个3,要得到25,至少要2个5,其余的素因子都只需一个就够了。

    所以,我们得到的最少的因子的组合就是 :2*2*2,3*3*3,5*5,7,11,13,19,23,29,31。将他们相乘就得到了最小的符合数据的数:2123581660200

    三.在电脑上运行这一程序,你估计要多长时间才能输出第一个结果?时间精确到分钟(电脑配置:单核CPU4.0GHz,内存和硬盘资源充足)

          大概需要138小时30分钟才可以算完整个程序。除法是由加法完成的,而一个加法大概占用一个时间周期,大约推算应该要很久才能运行完(我猜的)

    四.在多核电脑上如何提高这一程序的运行效率?

    一个处理器中集成两个或多个完整的计算引擎(内核)多核电脑可以在同时执行几个运算操作,大大提高执行速度。
    利用IOCP按照核心数将任务分批到单个核心。多核心处理器其实就是为了能同时处理多个任务,单核心的主频同样很重要!!

    注:IOCP

       这就是传说中的IOCP,所谓IOCP听起来很高大上,其实IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字[socket]与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。(定义来自百度百科)

       优缺点

          

    优点:
      ① 帮助维持重复使用的内存池。(与重叠I/O技术有关)
      ② 去除删除线程创建/终结负担。
      ③ 利于管理,分配线程,控制并发,最小化的线程上下文切换。
      ④ 优化线程调度,提高CPU和内存缓冲的命中率。
    缺点:
      理解以及编码的复杂度较高。对使用者有一定要求。
      需了解以下基本知识:
      ① 同步与异步
      ② 阻塞与非阻塞
      ③ 重叠I/O技术
      ④ 多线程
      ⑤ 栈、队列这两种基本的数据结构
     
     

    PS:

    这个博客根本不支持拖拽上传好嘛

     

  • 相关阅读:
    control与delegate的Invode、BeginInvoke (一) jason
    你是否愿意每周最少工作80小时 (转)
    详解ASP.NET的SEO:服务器控件背后故事
    深度解析Windows Phone 7开发
    .NET 4新特性:表、SEO及可扩展输出缓存
    VS2010中Parallel类实现并行计算
    iPhone破解软件定制版blackra1n 提供下载
    .NET 4中废弃的特性
    Windows Server 2008 R2上安装WSUS 3.0 SP2
    关于浮动
  • 原文地址:https://www.cnblogs.com/PerseusQ/p/5298964.html
Copyright © 2011-2022 走看看