NYOJ 题目85

有趣的数

时间限制: 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项
样例输入
4314712345
样例输出
2/12/41/459/99
找规律,细心就可以,或者可以把三角形顺时针转90来看,然后找规律即可。
#include<stdio.h>
int number1[1000];
int main()
{
    int n,m,j,k,t;
    int i=1,sum=0;
    while(1)///打表存放1+2+3+4...每个和的值,方便之后找到在第几行
    {
        sum=sum+i;
        number1[i]=sum;
        i++;
        if(sum>100000)
            break;
    }
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        for(j=1;j<i;j++)///寻找输入的号码在第几行1+2+3+4+......
        {
            if(n<=number1[j])
            {
                t=j;///确认行数
                break;
            }
        }
        if(t%2!=0)///奇数行中存在数在最正中间的情况,单独讨论,同时观察后可知奇数行都是从左到右排序
        {
            if((number1[j]-n)==(n-number1[j-1]-1))
                printf("%d/%d\n",(t+1)/2,(t+1)/2);
            if((number1[j]-n)<(n-number1[j-1]-1))///根据规律分子从该行行数到1,分母从1到该行行数,这是离右边较近的情况
            {
                int z=t-(number1[j]-n);
                int y=number1[j]-n+1;
                printf("%d/%d\n",y,z);
            }
            if((number1[j]-n)>(n-number1[j-1]-1))///这是奇数行离左边较近的情况
            {
                int z=t-(number1[j]-n);
                int y=number1[j]-n+1;
                printf("%d/%d\n",y,z);
            }
        }
        if(t%2==0)///偶数行没有最中间的情况
        {
            if((number1[j]-n)<(n-number1[j-1]-1))///根据规律偶数行从右到左的排序,分子从1到该行的行数,分母从该行的行数到1
            {
                int z=t-(number1[j]-n);///分子分母总和为该行的行数加1
                int y=number1[j]-n+1;
                printf("%d/%d\n",z,y);
            }
            if((number1[j]-n)>(n-number1[j-1]-1))///
            {
                int z=t-(number1[j]-n);///分子分母的总和为该行的行数加1
                int y=number1[j]-n+1;
                printf("%d/%d\n",z,y);
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值