博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

这是第三次作业的第二部分,阅读他人程序并理解加以改进。

下面是源代码:

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上跑了一上午,但是始终没有结果,我也不清楚是我的电脑性能不强还是这个数真的找不到。

这次的代码阅读分析作业让我学到了很多,尤其让我体会到阅读和修改别人代码的困难之处。就像张老师在课上说的:老程序员宁可自己写一个算法来实现别人想要的功能,也不愿意修改别人的代码。的确是这样,阅读并理解别人的代码首先就要用别人的思维方式思考问题,更别提要修改了。在这上面花费的时间,可能比重新写一个算法程序消耗的时间还多。这也为我以后的学习生活提了个醒,如果有需要别人帮忙修改,一定要将自己的想法与思路与人分享,这样才能互利互惠,更有助于今后团队项目开发,对提升工作效率和项目成功率有着很大的帮助。