南阳理工oj 题目85 有趣的数 Cantor数表

有趣的数

描述
把分数按下面的办法排成一个数表。
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 1/2 1/3 1/4 1/5 1/6…..
2/1 2/2 2/3 2/4 2/5….
3/1 3/2 3/3 3/4 ….
4/1 4/2 4/3…..
5/1 5/2………
6/1…….
这道题是 根据所给的N,在如图所示的排列中找到第N个数,关键在于读数的方法,或者说顺序.
题中的数应按照Z型去读.读的顺序入图.
这里写图片描述
按照如图斜线去读。第1条斜线有1个数,第2条有2个数,第3条有3个数……第k条有k个数。这样,前k条斜线一共有S=1+2+3+……+k个数。

这样你会发现行数k的奇偶性会影响分子分母的谁大谁小.
若k是奇数,第k条斜线上倒数第i个元素是i/(k+1-i);
若k是偶数,第k条斜线上倒数第i个元素是(k+1-i)/i。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n,m,k,l;
    scanf("%d",&l);
    while(l--)
    {
        scanf("%d",&k);
        n=0;m=0;
        while(n<k)
        {
            m+=1;
            n+=m;
        }
        if(m%2==0)
            printf("%d/%d\n",m+k-n,n-k+1);
        else
            printf("%d/%d\n",n-k+1,m+k-n);
    }
    return 0;
}
posted @ 2017-05-28 15:40  南风古  阅读(177)  评论(0编辑  收藏  举报