分类: 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=2时v=4;10~13,14~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编程之中,就会慢慢的体会到
编程的奥妙!
再次感谢那些乐意将自己知识分享的朋友。本文第一张图片是从网上剪切的,由于无法找到真实的作者,特在此声明!
好了相信你对这个问题应该明白了,我们今天先到这,如果你还有什么问题可以和我联系:
小孟在此谢谢各位的支持!