Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 108 Solved: 49
Description
TomCat 是一次單身Cat,但是他有著很多的基友,每次吃飯都會(huì)QQ他的某一只基友,然而,他的基友Jerry 總是很墨跡。等待是無(wú)聊的,這時(shí)TomCat在學(xué)校的地上亂走,這時(shí)他發(fā)現(xiàn)地上有方塊鋪成的,他按照下圖的規(guī)律走,現(xiàn)在無(wú)聊的TomCat想知道,他如果走了n步,他應(yīng)該在什么位置,位置用坐標(biāo)(x,y)表示。


?
Input
每次輸入一個(gè)數(shù)n,n=0是輸入結(jié)束(n<=2*10^9)
Output
輸出坐標(biāo)(x,y)
Sample Input
8 20 25 0
Sample Output
2 3 5 4 1 5
HINT
題解:
找規(guī)律后分類(lèi)討論。
|1 |
| 2 3 4 |
| 5 6 7 8 9 |
| 10 11 12 13 14 15 16 |
| 17 18 19 20 21 22 23 24 25 |
| 26 27 28 29 30 31 32 33 34 35 36 |
| ...... |
1、先找坐標(biāo)類(lèi)似(1,1),(2,2),(3,3)的數(shù)字對(duì)應(yīng)的是:1,3,7。數(shù)字取平方根再加1就是它的坐標(biāo)。
| 坐標(biāo) | 對(duì)應(yīng)數(shù)字 | 對(duì)應(yīng)數(shù)字取平方根取整 |
| (1,1) | 1 |
|
| (2,2) | 3 | 1 |
| (3,3) | 7 | 2 |
| (4,4) | 13 | 3 |
| .... | ... | ... |
2、拿輸入8舉例,距離8的兩個(gè)平方數(shù),一個(gè)是4,另一個(gè)是9.很明顯8距離9更近,這樣能判斷出8橫縱坐標(biāo)中的一個(gè)了,但是如何判斷是橫坐標(biāo)還是縱坐標(biāo)?再這里我舉例了幾個(gè)數(shù)字以及列出坐標(biāo)來(lái)幫助自己判斷。
| 8 (2,2) | 15(4,2) |
| 24(2,5) | 35(6,2) |
8和24的縱坐標(biāo)都是取平方根的整數(shù)部分之后加1,橫坐標(biāo)都是平方根取整數(shù)部分平方-自身。
那么15跟35剛好是橫縱坐標(biāo)倒過(guò)來(lái),如何區(qū)別?8和24的平平方根取整數(shù)是偶數(shù),而15跟35是奇數(shù)。
3、拿輸入20舉例,距離20的兩個(gè)平方數(shù),一個(gè)是16,一個(gè)是25。很明顯20距離16更近。
| 6 (3,2) | 11 (2,4) |
| 20 (5,4) | 27 (2,6) |
6和20的橫坐標(biāo)都是取平方根的整數(shù)部分之后加1,縱坐標(biāo)是自身-平方根取整數(shù)部分。
11跟27橫縱坐標(biāo)與6和20是倒過(guò)來(lái)的。
4、還有一種是討論本身就是平方數(shù)的情況,也是根據(jù)平方根取整后的奇偶性來(lái)判斷。
代碼:
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double l,r;
double y;
int x;
int a,b;
while(~scanf("%d",&n))
{
if(n==0)
break;
y=sqrt(n);
x=(int)sqrt(n); //平凡根取整數(shù)部分
l=x*x; //左邊的平方數(shù)
r=(x+1)*(x+1); //右邊的平方數(shù)
l=n-l; //數(shù)字本身跟左邊平方數(shù)差多少
r=r-n; //數(shù)字本身跟右邊平方數(shù)差多少
if(x*x==n) //討論數(shù)字本身是平方數(shù)的情況
{
if(x%2==0)
{
a=x;
b=1;
//printf("6\n");
}
else
{
a=1;
b=x;
//printf("7\n");
}
}
else
{
if(l<r&&x%2==0) //距離左邊平方數(shù)更近且其平凡根為偶數(shù)
{
a=x+1;
b=n-x*x;
//printf("1\n");
}
else if(l<r&&x%2!=0)
{
a=n-x*x;
b=x+1;
if(a==0)
{
a=1;
b=x;
}
//printf("2\n");
}
else if(l>r&&x%2==0)
{
a=(x+1)*(x+1)-n+1;
b=x+1;
//printf("3\n");
}
else if(l>r&&x%2!=0)
{
a=x+1;
b=(x+1)*(x+1)-n+1;
//printf("4\n");
}
else if(l==r)
{
a=x+1;
b=x+1;
//printf("5\n");
}
}
printf("%d %d\n",a,b);
}
return 0;
}