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.容易发现紧靠坐标轴的两条数字是i * i,和 i * i +1,然后判断给出的n离哪个更近,判断更靠近的那个数a[i] = i * i 中 i 的奇偶,i是偶数,n在竖着的那条里,可以确定n的x坐标;n是奇数,n就在横着的那条里,可以确定n的y坐标。
扫描二维码关注公众号,回复:
2985539 查看本文章
2.最近很喜欢对数据先预处理一下,感觉会更省时间一点。
【一点体会】
这道题是我“7.26 五-暑假训练赛”里的一道题目,今天刷oj碰到了,自己写了一遍,感觉暑假的进步还是很大的,这道题我当时写的磕磕绊绊的,而且当时的解题报告笔记本里最后还留了个这个,
现在能流畅的写出来了,感觉很开心哟!
#include<cstdio>
#include <cstring>
#include<algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 2e9 + 5;
const int x = 1e5 + 10;
int a[x];
void init()//预处理
{
for(int i = 1 ; i <= sqrt(maxn);i++ )
{
a[i] = i * i;
//cout<<a[i]<<endl;
}
}
int main()
{
init();
int n;
while(cin>>n)
{
int res_x,res_y;
if(n == 0)
break;
if(n == 1)
printf("1 1\n");
else
{
for(int i = 1; i < x;i++)
{
if(n == a[i])
{
if(i % 2 == 0)
printf("%d 1\n",i);
else
printf("1 %d\n",i);
}
else if(n > a[i] && n < a[i + 1])
{
int dis_1 = abs(a[i] - n);
int dis_2 = abs(a[i + 1] - n);
if(dis_1 < dis_2)//取i,判断i的奇偶
{
if(i % 2 == 0)
{
res_x = i + 1;
res_y = n - a[i];
printf("%d %d\n",res_x,res_y);
break;
}
else
{
res_y = i + 1 ;//????
res_x = n - a[i];
printf("%d %d\n",res_x,res_y);
break;
}
}
else if(dis_1 > dis_2)//取 i + 1,判断i + 1的奇偶
{
if((i + 1) % 2 == 0)
{
res_x = i + 1;
res_y = a[i + 1] - n + 1;
printf("%d %d\n",res_x,res_y);
break;
}
else
{
res_y = i + 1;
res_x = a[i + 1] - n + 1;
printf("%d %d\n",res_x,res_y);
break;
}
}
}
}
}
}
return 0;
}