今天到一家公司去应聘,问过一些基础知识后,让我做一道题,关于算法的,我平常不注重算法,所以没有答上。真是郁闷呀。回家后一查原来是第五届全国青少年信息学(计算机)奥林匹克分区联赛普及组复赛试题中的一道。真晕。我都24了难道还是少年组的水平!!!!!唉,难受呀,一会饿补下算法的部份。
把题帖出来大家分享下吧,唉。-------------------------------------------------------------
第一题 Cantor表(30分)
现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张
表来证明这一命题的:
1/1  1/2  1/3  1/4  1/5 ...
2/1  2/2  2/3  2/4  ...
3/1  3/2  3/3  ...
4/1  4/2 ...
5/1
   我们以z字型给上表的每一项编号。第1项是1/1,然后是1/2,2/1,3/1,2/2...
输入:整数n(1<=n<=10)
输出:表中的第N项
样例:
input:  n=7
output: 1/4

解决方案 »

  1.   

    那个考官一眼就能看出来是个重能力不重文凭地。
    我还没说他让我用任何语言print一个 ,唉。
         
         15  16  17  18  1
         14  27  28  19  2
         13  26  29  20  3 
         12  25  30  21  4
         11  24  23  22  5
         10  9    8  7   6
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, j, k, n: integer;
    begin
      i := 1;
      n := strtoint(edit1.Text);
      while true do
        if n > i then
        begin
          n := n - i;
          i := i + 1;
        end
        else
          break;
      if i mod 2 = 1 then
      begin                 {j/k}
        j := i + 1 -n;
        k := n;
      end
      else
      begin
        j := n;
        k := i + 1 - n;
      end;
      edit1.Text := inttostr(j) + '/' + inttostr(k);
    end;
      

  3.   

    char *Get(int n)
    {
            char str[256];
            int i = sqrt(2*n);
            if(i*(i+1)>=2*n)i--;
            int j = n-(i+++1)*i++/2;
            if(i%2){
                    i-=j;
                    sprintf(str, "%d/%d", j, i);
            }
            else
            {
                    i-=j;
                    sprintf(str, "%d/%d", i, j);
            }
            return str;
    }
      

  4.   

    pazee(耙子)的算法写出来的代码最短。
    但偶觉得亦可的想法更能体现计算机解题的方法。
    呵呵,一家之言
      

  5.   

    首先确定根据k(k+1)/2<n<(k+1)(k+2)/2可以确定k+1就是n所在的斜行号
    再看k是奇数还是偶数确定是
      

  6.   

    首先根据k(k+1)/2<n+1<(k+1)(k+2)/2来确定k,K+1就是n所在的斜行号,u=n-k(k+1)/2+1,
    再看k是奇数还是偶数确定是u/k还是(k-u)/k