有趣的数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
把分数按下面的办法排成一个数表。
1/1 1/2 1/3 1/4.....
2/1 2/2 2/3....
3/1 3/2 ....
4/1.....
.........我们以z字型方法给上表的每项编号。特定方法:第一项是1/1,然后是1/2、2/1、3/1、2/2、1/3、1/4、2/3……。编程输入项号N(1<=N<=100000),输出表中第N项。
-
输入
-
第一行有一个整数m(0<m<=10),表示有m组测试数据;
随后有m行,每行有一个整数N; -
输出
- 输出表中第N项
-
第一行有一个整数m(0<m<=10),表示有m组测试数据;
样例输入
4 3 14 7 12345
2/1 2/4 1/4 59/99
有趣的数...一点也没趣....找规律整整找了一上午,然后a 了之后,已经过去中午的饭点了.........
其实也是不难找到规律的,把这些数写下来一部分,就很容易的发现规律了.......
首先需要找到最小的一个数 x ,使得前x个自然数大于或等于 n ,然后输出的两个数的和就是 x+1,然后分子的顺序是 第 i 行全部是 i ,只需要找到那一个数是第几行的就行了,不过,这个过程是上下来回的,需要注意奇偶的情况,具体的行数需要多处理一步.........
为了查找 x 个人使用的二分..快一点,其他的就要靠自己找规律了....
#include<stdio.h>
#define min(a,b) (a<b?a:b)
#define maxn 100005
long long s[505];
void db()//先累加前 n 项和
{
s[0]=0;
for(int i=1;i<505;++i)
{
s[i]=s[i-1]+i;
}
}
int search(int tp)//查找符合条件的元素
{
int l=0,r=1004,mid;
while(l<r)
{
mid=(l+r)>>1;
if(s[mid]>=tp)
{
r=mid;
}
else
{
l=mid+1;
}
}
return r;//返回满足条件的值
}
int main()
{
int t;db();
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int temp=search(n),x,y;
x=(n-s[temp-1]);//找出最后剩下几行
if(temp&1)
{
x=temp+1-x;//如果是奇数,那么就正好是反着统计行数的
}
y=temp+1-x;//找出分母
printf("%d/%d\n",x,y);//!!!!!注意!
}
return 0;
}