第三周作业(二):分析代码
给了一段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.固态硬盘加快数据传输速度,再改一下算法或许会比较好。