Problem D: TomCat要吃饭

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;                                       
}

猜你喜欢

转载自blog.csdn.net/qq_42079027/article/details/81209719
今日推荐