分析
根据题目描述可以知道该题是按照斜线来标号
第一行 | 1/1(1) | ||||
第二行 | 1/2(2) | 2/1(3) | |||
第三行 | 3/1(4) | 2/2(5) | 1/3(6) | ||
第四行 | 1/4(7) | 2/3(8) | 3/2(9) | 4/1(10) |
有上面表可以知道规律如下;
1:每i行有i个数字
2:奇数行分子从大到小,偶数行分子从小到大;
都是1~i个数字。
# include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int k=1;
while(n>k)
{
n-=k;
k++;
}
if(k%2==0)
{
cout<<n<<"/"<<k-n+1;
}
else
{
cout<<k-n+1<<"/"<<n<<endl;
}
}
第二种方法:二分
根据上面表格,可找出以下规律每i行的分子分母相加等于i+1;
二分行数;
第i行行数包括i*(i-1)/2+1~i*(i+1)/2
# include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int l,r;
l=1;
r=n;
while(l<r)
{
int mid=(l+r)>>1;
if(mid*(mid+1)/2<n)
{
l=mid+1;
}
else
{
r=mid;
}
}
int a=n-l*(l-1)/2;
if(l%2==0)
{
cout<<a<<"/"<<l+1-a<<endl;
}
else
{
cout<<l+1-a<<"/"<<a<<endl;
}
}
第三种:暴力枚举(略)