p1014Cantor表,找规律/暴力
找规律,先打表
我们可以发现这个就是一行一行的排列,
第一行一个,第二行两个。。。。
所以我们可以求出n所在行最后一个是第几个,
然后求出n的所在位置,(x,y)x+y==每行个数num-1
当然所在位置单行是顺着排,双行是逆着排
试几个数求出就可以了
#include <bits/stdc++.h> using namespace std; int n,sum,num; int main(int argc, char** argv) { cin>>n; while(sum<n){//找到n所在行的最后一个数的顺序 num++; sum+=num; } if(num%2){ cout<<sum-n+1<<"/"<<num-sum+n<<endl;//试着求出 }else{ cout<<num-sum+n<<"/"<<sum-n+1<<endl; } return 0; }
这个直接暴力可以a掉
#include <bits/stdc++.h> using namespace std; int n; int main(){ cin>>n; for(int i=1,j=1,cnt=1;cnt<n;){ while(i-1>0&&cnt<n) --i, ++j, cnt++;//走到上界转弯 if(cnt<n) ++j, cnt++; while(j-1>0&&cnt<n) ++i, --j, cnt++;//走到下界转弯 if(cnt<n) ++i, cnt++; if(cnt==n) printf("%d/%d\n",i,j); } return 0; }