Description
TomCat 是一次单身Cat,但是他有着很多的基友,每次吃饭都会QQ他的某一只基友,然而,他的基友Jerry 总是很墨迹。等待是无聊的,这时TomCat在学校的地上乱走,这时他发现地上有方块铺成的,他按照下图的规律走,现在无聊的TomCat想知道,他如果走了n步,他应该在什么位置,位置用坐标(x,y)表示。
Input
每次输入一个数n,n=0是输入结束(n<=2*10^9)
Output
输出坐标(x,y)
Sample Input
8 20 25 0
Sample Output
2 3 5 4 1 5
分析:
这是一道找规律的题,但是这种图形找规律的,我一般是找不出来的。啊,陈同学竟然说这是小学数学题,可是我不会啊????好在参考了别人的题解,看懂了。。。
首先关键点在于(1,1)(2,2)...(x,x)对角线上的点n=x(x-1)-1
因为给出的是n,通过根号n,根号n+1,知道大概的位置在哪一行那一列,计算n与对角线上的n的差值,求出坐标(分奇偶,)
以下为参考其他博客写出的代码:
#include<stdio.h>
#include<math.h>
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF&&n)
{
long long x=sqrt(n);
if(x*x==n) //如果n是一个数的平方,那么这个数肯定在边上。
{
if(x%2!=0) printf("1 %lld\n",x);//奇数在最左面一列(1,sqrt(n))
else printf("%lld 1\n",x);//如果是偶数那么在最底下一行 (sqrt(n),1)
continue;
}
x++; //n开根号后+1得到的x,,,即答案的横或纵坐标(看奇偶性
long long n2=x*x-x+1; //对角线上的值 即(x,x) 的值
if(x%2) //如果x为奇数
{
if(n<n2) printf("%lld %lld\n",x,x-n2+n); //(x,y) y=x-对角线上的值与n的差值
else printf("%lld %lld\n",x-n+n2,x); //(y,x)
}
else //如果偶数
{
if(n>n2) printf("%lld %lld\n",x,x-n+n2);//(x,y)
else printf("%lld %lld\n",x-n2+n,x);//(y,x)
}
}
return 0;
}