7 49 48 47 46 45 44 43
6 26 27 28 29 30 31 42
5 25 24 23 22 21 32 41
4 10 11 12 13 20 33 40
3 9 8 7 14 19 34 39
2 2 3 6 15 18 35 38
1 1 4 5 16 17 36 37
1 2 3 4 5 6 7
看对称线 1 3 7 13 21 ...
可以推出an=n(n-1)+1;
如果有一个工具能判断出输入的数是在第几行/列,那么就简单了.(只需加/减去相应的步数就可以了).
幸运的是,用ceil()函数能完成.(ceil()返回>=指定表达式的最小整数值).
int main()
{
int an;
while(scanf("%d",&an)==1&&an)
{
int n=(int )ceil(sqrt(an));///找到元素所处的行/列。
int axis=n*(n-1)+1; ///找到该行/列的轴的值。
int x,y;
if(n&1) ///如果是奇数(奇数列:行值大于轴,列值小于轴。反之亦反)
{
if(an>=axis)
{
y=n;
x=n-(an-axis);
}
else
{
x=n;
y=n-(axis-an);
}
}
else
{
if(an>=axis)
{
x=n;
y=n-(an-axis);
}
else
{
y=n;
x=n-(axis-an);
}
}
printf("%d %d\n",x,y);
}
return 0;
}