这是第三次作业的第二部分,阅读他人程序并理解加以改进。
下面是源代码:
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语言的功底,所以大部分语句都能理解。该程序的目的很明确,就是寻找一种数。程序用两个for循环嵌套进行控制,开始我并不明白 Int64 i = 1; i < Int64.MaxValue 这表明的数的范围有多大,通过上网查资料,我明白了int64指的是占有8字节64bit的长整数,表示值介于-2^63~2^63-1。所以可以看出这个循环控制的是寻找数的范围。
接下来看下一个循环 for (int j = 0; (j < rg.Length) && (hit <=2) ; j++) ,输入数组里包含三十个整数,2~31,所以rg.length=30。
if ((i % rg[j]) != 0)
{
hit++;
if (hit == 1)
{
hit1 = j;
}
else if (hit == 2)
{
hit2 = j;
}
else
break;
}
通过这个判断语句可以看出,hit是一个控制是否被整除的次数的变量。所以要找寻的数首先要满足在1~MaxLalue之内不能被整除,hit1作为第一个不能被整除数的下标,hit2作为第二个不能被整除书的下标,但是从最后的输出判断语句来看,当(hit1+1==hit2)时才能输出,所以还要要求是两个相邻的数,当我想明白这一点我就隐隐猜到估计没有这样的数。后来在VS上跑了一上午,但是始终没有结果,我也不清楚是我的电脑性能不强还是这个数真的找不到。
这次的代码阅读分析作业让我学到了很多,尤其让我体会到阅读和修改别人代码的困难之处。就像张老师在课上说的:老程序员宁可自己写一个算法来实现别人想要的功能,也不愿意修改别人的代码。的确是这样,阅读并理解别人的代码首先就要用别人的思维方式思考问题,更别提要修改了。在这上面花费的时间,可能比重新写一个算法程序消耗的时间还多。这也为我以后的学习生活提了个醒,如果有需要别人帮忙修改,一定要将自己的想法与思路与人分享,这样才能互利互惠,更有助于今后团队项目开发,对提升工作效率和项目成功率有着很大的帮助。