• C#代码分析


    作为一个计算机专业的学生,代码分析是一件很平常的,并且需要经常做的事情。

    当刚接手一个程序编码、课设或者一个项目时,常常会因找不到思路而抓狂。而网络就是最好的工具,查看许多IT人的技术博客网站,经常采集他人代码的长处,就会得到非同一般的效果。如下代码是由C#编写,对这种语言不是很熟悉,但有C语言的基础,应该不是特别难。

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

    现在把代码进行分解:基本看来是个找数的操作,它是由两个for循环嵌套控制,for (Int64 i = 1; i < Int64.MaxValue; i++)
    首先Int64.MaxValue这个数是多大?在网上找到了答案,Int64是有符号 64 位整数数据类型,相当于C++中的long long、 C# 中的 long 和 SQL Server 中的 bigint,表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数。存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。那就应该是个很大的数了,在这么大的范围为了找几个数,看来不是很好找。。。

    再看小循环,for (int j = 0; (j < rg.Length) && (hit <=2) ; j++),rg[]是个内部含有由2~31的整数组成,共有30个数,rg.length=30。

    那究竟什么样的数才会是要找的数呢

    if ((hit == 2)&& (hit1+1==hit2))
    	        {
    	          Console.WriteLine("found {0}", i);
    	        }
    

    hit==2&&hit1+1==hit2满足这个条件才会输出,看一看判断条件if ((i % rg[j]) != 0),也就是说要从1~MaxLalue之内判断不能够整除的数,hit1为第一个不能整除数的下标,hit2为第二个不能整除数的下标。要求hit1+1==hit2,那就是说这两个数要连续,而第二个条件就是hit==2,for (int j = 0; (j < rg.Length) && (hit <=2) ; j++),hit>2就要退出小循环hit还要等于2,也就是说只能有两个不能被整除的数,而且要连续。

    只能说这个数真心不太好找。。。

    用vs运行了一下,等了90分钟没有结果。于是我改了下范围,大循环i<Int32.MaxValue,如下图,found1是循环结束的小标记(因为在Int64.MaxValue迟迟没有结束,就想着用一句话来标记一下,Int32.MaxValue运行时间为99.4314475

    运行时间代码:

                TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
                string spanTotalSeconds = ts2.Subtract(ts1).Duration().TotalSeconds.ToString(); //计算整个程序的运行时间
                Console.WriteLine(spanTotalSeconds);
                Console.ReadKey();

    范围是Int16.MaxValue时,运行如下:

     然而或许我没等到时间,90分钟还没有结束(感觉第一次运行这么久),我的电脑是这样的配置,或许这样的数真的不存在

    假设这个数出现在范围的一半位置,那么需要找2^62=4.611686018X10^18,假设计算机每秒计算一次,因为小循环内平均要执行4步,小循环会有2-30次不等,因为条件比较苛刻,所以估算大约要执行20步,那么,因为计算机位4.0GHZ,所以,计算机每秒执行2X10^8个小循环,即寻找这么多个数,那么需要,2.3X10^10秒,即为4X10^8分钟。。。。于是放弃了计算。。。。。。。

    如果想提高计算速度,在多核电脑上我们可以给每个核分配不同的找数范围,提高计算效率,虽然觉得现在基本上多核技术都是在流水线技术上做文章,但是表示并不懂原理,只能想着在找数范围上做文章了。。。。。。

  • 相关阅读:
    vue element-admin 清空校验
    vue+elementui 动态改变表单必填项
    什么是中台
    项目中遇到的一道算法题
    【解决】Word中公式突然乱码
    【解决】MATLAB报错:此上下文中不支持函数定义,请在代码文件中创建函数。
    【解决】Word打印成PDF出错:%%[ ProductName: Distiller ]%%
    Bike Sharing Analysis(二)- 假设检验方法
    Bike Sharing Analysis(一)- 探索数据
    Spark Structured Streaming(二)实战
  • 原文地址:https://www.cnblogs.com/wxl530/p/5293284.html
Copyright © 2020-2023  润新知