题目:按照绕半圈的顺序不断的摆放连续的数字(L型扩展),问数字n摆放的顺序。
分析:简单题。
最开始写这个题目用的是暴力的模拟,TLE后一看数据范围(⊙_⊙)
对于给定的数字,n求出他的整数平方根s,则根据s*s和n的关系就可以求得结果了。
如果s是奇数,就是从左向右走,如果是偶数就是从下往上走。
s*s <= n <= s*s+s 则直走,n > s*s+s 则转向后直走。
说明:注意数据范围( ⊙ o ⊙ )啊!
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
void deal( int n )
{
int s = (int)sqrt(n+0.0);
if ( s%2 ) {
if ( s*s == n )
printf("%d %d\n",1,s);
else if ( n <= s*s+s+1 )
printf("%d %d\n",n-s*s,s+1);
else
printf("%d %d\n",s+1,s+s+2-n+s*s);
}else {
if ( s*s == n )
printf("%d %d\n",s,1);
else if ( n <= s*s+s+1 )
printf("%d %d\n",s+1,n-s*s);
else
printf("%d %d\n",s+s+2-n+s*s,s+1);
}
}
int main()
{
int n;
while ( cin >> n && n )
deal( n );
return 0;
}