85-有趣的数
内存限制:64MB 时间限制:3000ms 特判: No
通过数:28 提交数:33 难度: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项
样例输入:
4
3
14
7
12345
样例输出:
2/1
2/4
1/4
59/99
分析:
数表提示我们按照斜线分类。第1条斜线有1个数,第2条有2个数,第3条有3个数……第k条有k个数。这样,前k条斜线一共有S=1+2+3+……+k个数。
第n项在哪条斜线上呢?只要找到一个最小的k,使得S≥n,那么第n项就是第k条斜线上倒数第S-n+1个数(最后一个元素是倒数第1个元素,而不是倒数第0个元素)。
而k的奇偶决定着第k条斜线上数的顺序:若k是奇数,第k条斜线上倒数第i个元素是i/(k+1-i);若k是偶数,第k条斜线上倒数第i个元素是(k+1-i)/i。
#include<stdio.h>
int main()
{
int number, n, i, t;
scanf("%d", &number);
while(number--)
{
scanf("%d", &n);
for(i=1;; i++)
{
t=(i*(i+1))/2;
if(n<=t&&t-n<=i)
{
if(i%2!=0)
{
printf("%d/%d\n", t-n+1, i-t+n);
break;
}
else
{
printf("%d/%d\n", i-t+n, t-n+1);
break;
}
}
}
}
return 0;
}