题目:求分数序列 1/1 1/2 2/1 3/1 2/2 1/3 ...的第N个数。
分析:简单题。打表计算出10000000以内的所有结果,查询输出。
打表利用模拟方法计算,设置一个方向变量flag,则满足如下地推关系:
设 F(i-1) = n/m,则 F(i) = n/(m+1) flag = -flag { n == 1 , flag > 0 }
= (n+1)/m flag = -flag { m == 1 , flag < 0 }
= (n+flag)/(m-flag) { 不在三角形的两直角边上 }
#include <stdio.h>
#include <stdlib.h>
int n[10000001];
int m[10000001];
int main()
{
int k,flag = 1;
n[1] = m[1] = 1;
for ( int i = 2 ; i <= 10000000 ; ++ i ) {
n[i] = n[i-1];
m[i] = m[i-1];
if ( n[i] == 1 && flag > 0 ) {
m[i] ++;
flag *= -1;
}else if ( m[i] == 1 && flag < 0 ) {
n[i] ++;
flag *= -1;
}else {
m[i] += flag;
n[i] -= flag;
}
}
while ( ~scanf("%d",&k) )
printf("TERM %d IS %d/%d\n",k,n[k],m[k]);
return 0;
}