Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47954
  • 博文数量: 18
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 209
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-11 19:33
文章分类

全部博文(18)

文章存档

2011年(1)

2009年(17)

我的朋友

分类: C/C++

2009-09-18 07:37:35

 1、仔细看下面的数字:                                                               

                                                             21 22 ........

                                                             20   7   8   9  10

                                                             19   6   1   2  11

                                                             18   5   4   3  12

                                                             17  16  15  14  13

                                                            

     看清以上数字排列的规律,设1点坐标为(0,0)x方向向右为正,y方向向下为正。

     所以7的坐标为(-1,-1)3的坐标(1,1)等。试编写程序,实现输入任意一点坐标

     (x,y),输出对应的数字。

                                                      ----芬兰著名通信设备公司2005年面试题                                                    

     这里有两张图,上面一张是我从网上找的,下面一张是我运行程序后自己接的图

       第一张图做的比较好,已经给我们画出了很多的信息!大家有好好的理解!

      






  代码:

         #include

    #define max(a,b) ((a)<(b)?(b):(a))

    #define abs(a) ((a)>0?(a):-(a))

   

    int

    getvalue(int x, int y){

         int t = max(abs(x),abs(y));       /*获取该坐标所在的圈数*/

         int u = t +t;

           int v = u -1;              /*一条边上元素的个数例如当t=2v=410~1314~17*/

         v = v * v + u;/*得到(t,t)的值,我们以它位基准开始计算机*/

           /*注意:v=v*v的结果是上一圈的最后一个数,也就是这一圈开始的数-1*/

         if (x == -t)

               v += u + (t – y);/*v=v+u将基准调到(-t,-t),(t-y)为该坐标在该边上的位置(第几个)*/

         else if(y == -t)

               v+= 3*u+(x-t);/*写开了也就是这样v+=3*u-(t-x)*/

         else if(y == t)

               v += t - x; /*和上面一样*/

         else v += y - t;       

         return v;

    }

    对这个函数应该可以明白了吧!

    int

    main(void)

    {

         int x,y;

         for(y = -4;y <= 4; y++){

               for(x = -4;x <= 4;x++)

                    printf("%5d", getvalue (x,y));

               printf("\n");

         }

         while(scanf("%d%d",&x,&y) == 2)

               printf("(%i,%i)的值为%d\n",x,y getvalue (x,y));

         return 0;

    }   

        

这里给出了一种方法,并且我在关键部分都给大家写了详细的注释,应该是可以看懂的吧!

当然这个题还可以从其他很多方面考虑,大家可以继续思考,我以后会给大家继续讲解其他方法。

写这篇文章我参考可不少的资料,也研究了很多的解法!等我们慢慢的深入到C编程之中,就会慢慢的体会到

编程的奥妙!

再次感谢那些乐意将自己知识分享的朋友。本文第一张图片是从网上剪切的,由于无法找到真实的作者,特在此声明!

 

好了相信你对这个问题应该明白了,我们今天先到这,如果你还有什么问题可以和我联系:

 

小孟在此谢谢各位的支持!

阅读(862) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-09-18 17:17:58

做的挺不错的 呵呵 支持!!!