描述
Today is The Double Eleven.However,I want to pursue my happiness.I do not wanna be a Damn Single!
One day, a girl called W(Well…she is my fiancee…)came to an M*M chessboard. She wanted to go around all the grids. So she began to walk along the chessboard according to this way: (you can assume that her speed is one grid per second)
At the first second, W was standing at (1,1). Firstly she went up for a grid, then a grid to the right, a grid downward. After that, she went a grid to the right, then two grids upward, and then two grids to the left in a word, the path was like a snake.
For example, her first 25 seconds went like this:
( the numbers in the grids stands for the time when she went into the grids)At the 8-th second , she was at (2,3), and at 20-th second, she was at (5,4).
Your task is to help me to calculate where she was at a given time (you can assume that M is large enough).
输入
Input file will contain several lines, and each line contains a number N (1 ≤ N ≤ 2*10^9), which stands for the time. The file will be ended with a line that contains a number ‘0’.
输出
For each input situation you should print a line with two numbers (x,y), the column and the row number, there must be only a space between them.
输入样例 1
8
20
25
0
输出样例 1
2 3
5 4
1 5
来源
own
思路
我们可以将图改成这样
1 2 3 4 5 1 1 4 5 16 17 2 2 3 6 15 18 3 9 8 7 14 19 4 10 11 12 13 20 5 25 24 23 22 21 观察对角线
3 - 1 = 2 7 - 3 = 4 13 - 7 = 6
我们可以看到对角线上的差值是等差数列,其公差为2
(Sn为对角线上第n个数的值减去第n-1个数的值)
因此 Sn-1 = 2(n-1) = An - An-1
所以 An = n2 - n + 1(对角线上第n个数的值)
用这个值去求上边和左边的数就会很简单了
只需判断n的奇偶来执行x与y的加减即可。
代码
#include <cstdio>
#include <cmath>
using namespace std;
void moni(int n){ // An = mid = n * n - n + 1; An - A(n-1) = 2 * (n-1)
int i, x, y, t, mid;
mid = sqrt(n);
if(mid * mid != n) mid++; // 计算值在第几个对角线
x = y = mid * mid - mid + 1; // 得到该值所处的对角线的值
if(x == n) printf("%d %d\n", mid, mid);
t = mid;
for(i = 1; i < t; i++){
if(t % 2 == 0){
x--;
y++;
}
else{
x++;
y--;
}
mid--;
if(x == n) printf("%d %d\n", mid, t);
else if(y == n) printf("%d %d\n", t, mid);
}
}
int main(){
int n;
while(~scanf("%d", &n)){
if(n == 0) return 0;
else moni(n);
}
return 0;
}