由于本人是新手,所以刚看这道题,就想着用数组存数据,然后再根据输入的n找到n的位置,直到写的时候才发现n有大小限制,那么我用数组写的想法就不能用了了,由于太垃圾实在想不出其他的办法就只能看大佬的题解了,看完之后慢慢想想,终于看出了一点门道,你看图中左下角到右下角的数字正好是一个等差数列,知道就也好办了
,根据这些判断上下左右的数字与这些数字的关系,大于的分成一类,小于的分成一类,然后再判断输出就行;
本人的语言叙述实在有限,话不多说,上代码(代码写的也不好):
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
void where(int n)
{
int m=sqrt(n);
if(m*m==n){ //判断 n 是否是 m 平方数;
if(m%2==0) //判断 n 在第一行还是在第一列;
cout<<m<<" "<<1<<endl;
else
cout<<1<<" "<<m<<endl;
}
else{
if(n==m+m*m+1) //判断 n 是否为左下角到右下角上的数字;
cout<<m+1<<" "<<m+1<<endl;
else if(n>m+m*m+1){ //判断 n 是否大于该行或该列对角线上的数字;
int p=n-m*m-m-1; //找出 n 与对角线上数字的位置差;
if(((m+1)*(m+1)-m-m*m-1)%2==0)//判断 n 是否在对角线数字的左面;
cout<<m+1-p<<" "<<m+1<<endl;
else //判断 n 是否在对角线数字的下面;
cout<<m+1<<" "<<m+1-p<<endl;
}
else if(n<m+m*m+1){ //判断 n 是否小于该行或该列对角线上的数字;
int p=m+m*m+1-n; //找出 n 与对角线上数字的位置差;
if((m+m*m+1-(m-1)*(m-1))%2==0) //判断 n 是否在对角线数字的下面;
cout<<m+1<<" "<<m+1-p<<endl;
else //判断 n 是否在对角线数字的左面;
cout<<m+1-p<<" "<<m+1<<endl;
}
}
}
int main()
{
int n;
while(cin>>n && n!=0){
where(n);
}
return 0;
}