第三周作业(二):分析代码

      给了一段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);
        }
      }
    }
  }
}

      讲道理,我是没有学习过C#的,仅仅学习了C和C++,稍微看了一下JAVA。

      前面的那几行using大概是类似于C里的include,之后往下看倒是没有什么问题,不过看到了Int64和Int64.MaxValue,倒是没见过,然而从使用方法来看Int64应该是属于一种很长的整形,而Int64.MaxValue应该是属于该整形的最大取值范围。去网上一查倒也是猜对了,但是Int64.MaxValue这个范围真的是大得离谱:

表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数。存储空间占 8 字节。用于整数值可能超过 int 数据类型支持范围的情况。

    (出自百度百科)

      这个时候就开始疑惑了,到底是什么数才会要从这么大的范围里面找?为什么这个程序的代码不使用int,而使用int64?

      于是就把代码放进了编译器里面走一波,然而发现……没动静。这到底是编译发生问题还是这个数特别难找?亦或是这个数根本就找不到?

      从程序代码继续看,第二个for循环

for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)

      循环条件是j小于数组rg的长度并且还要hit小于等于2,循环内容就是不断地判断hit到底该取什么值

      回到第一个for循环跳过第二个for循环往下看,可以看到一个if语句,这个就是输出要找的数的输出语句

if ((hit == 2)&& (hit1+1==hit2))

      看了一会,终于也是知道要干什么了。

      回答问题:

1.要找的大概是满足的数是“不可以同时整除2到31中连续的两个数可以整除其他的”。

2.应该不存在,因为等了半天黑框框都没动。(不排除硬件限制,但是没有得到结果之前只能认定为不存在)

3.不存在的数无法计算。

4.固态硬盘加快数据传输速度,再改一下算法或许会比较好。

  
原文地址:https://www.cnblogs.com/mohaozhong/p/5294875.html