NYOJ 85. 有趣的数

来源:互联网 发布:java trimend 编辑:程序博客网 时间:2024/05/18 20:07
有趣的数
时间限制: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项


样例输入

4
3
14
7
12345
样例输出
2/1
2/4
1/4

59/99

【分析】数学问题+找规律

        不难发现,编号和对应的分数是存在规律的。从右上角向左下角看,奇数条斜线上编号自右上角向左下角递减,而偶数条斜线上编号自右上角向左下角递增。因此我们可以计算出第N项所在斜线之前的编号数目之和sum,并确定该编号在第line条斜线上,然后找到编号N与分子分母的对应关系。(例:N=7,则sum=6,line=4,对应的分数为1/4)

#include <stdio.h>int m,N;int main(){int line;    //表示N在第几条三角形斜线上 int sum;     //N所在斜线前面包含的编号数目之和 int fz,fm;   //待求的分子分母 scanf("%d",&m);while(m--){scanf("%d",&N);line=sum=0;while(sum<N)   //求解sum与line {line++;sum+=line;}sum-=line;     //因为sum多加了line一次,循环结束后要减掉 if(line%2==1)  //根据line是奇数还是偶数,确定分子分母 {fz=line-(N-sum)+1;fm=N-sum;} else{fz=N-sum;fm=line-(N-sum)+1;}printf("%d/%d\n",fz,fm);}return 0;} 

原创粉丝点击