有趣的数
时间限制:
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; }