两个试题解决思路
两个试题
1.将A B两个整数交换 不要涉及第三个变量 并考虑溢出问题
2.有螺旋数阵(如图 1为【0,0】,2为【0,1】,7为【-1,-1】)要求输入坐标能求得坐标对应数值,或输入数值能得出其坐标
图:
10 12 ...
9 2 3
8 1 4
7 6 5
------解决方案--------------------
两个变量A,B
A+B=A
B=A-B
A=A-B
怎么考虑溢出问题,没有想好
------解决方案--------------------
第二题:
两个函数如下:
1.将A B两个整数交换 不要涉及第三个变量 并考虑溢出问题
2.有螺旋数阵(如图 1为【0,0】,2为【0,1】,7为【-1,-1】)要求输入坐标能求得坐标对应数值,或输入数值能得出其坐标
图:
10 12 ...
9 2 3
8 1 4
7 6 5
------解决方案--------------------
两个变量A,B
A+B=A
B=A-B
A=A-B
怎么考虑溢出问题,没有想好
------解决方案--------------------
第二题:
两个函数如下:
- C/C++ code
#include "stdio.h" #include "math.h" #define max(a,b) (((a) > (b)) ? (a) : (b)) typedef struct tagPoint{ int x; int y; }Point; Point int2pt(int x) { Point pt; int r=(int)sqrt(x); if(r%2==0) { if(x-r*r==0) { pt.x=r/2; pt.y=1-r/2; } else if(x-r*r<r+1) { pt.x=r/2-(x-r*r-1); pt.y=-r/2; } else { pt.x=-r/2; pt.y=r/2-(r+1)*(r+1)+x; } } else { if(x-r*r==0) { pt.x=-r/2; pt.y=r/2; } else if(x-r*r<r+1) { pt.x=(x-r*r-1)-r/2; pt.y=r/2+1; } else { pt.x=r/2+1; pt.y=(r+1)*(r+1)-x-r/2; } } return pt; } int pt2int(Point pt) { int n=max(abs(pt.x),abs(pt.y)); if(pt.x==n) return (2*n-1)*(2*n-1)+2*n+n-pt.y; else if(pt.y==n && pt.x>-n) return (2*n-1)*(2*n-1)+pt.x+n; else if(pt.x==-n) return 4*n*n+2*n+n+pt.y+1; else if(pt.y==-n) return 4*n*n+n-pt.x+1; return -1; } void main() { int i; for(i=1;i<40;i++) { Point pt = int2pt(i); printf("%d\t%d,%d\t%d\n",i,pt.x,pt.y,pt2int(pt)); } }