两个试题解决思路

两个试题
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));
    }
}