NYOJ 85 有趣的数
地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=85
法一:
1 #include<stdio.h> 2 int main() 3 { 4 int i,k,m,n; 5 scanf("%d",&m); 6 while(m--) 7 { 8 scanf("%d",&n); 9 for(i=1;i*(i+1)>>1<n;i++); 10 k=n-(i*(i-1)>>1); 11 if(i&1) 12 printf("%d/%d\n",i+1-k,k); 13 else 14 printf("%d/%d\n",k,i+1-k); 15 } 16 return 0; 17 }
法二:
1 #include<stdio.h> 2 int f(int n) 3 { 4 if(n==1) 5 return 1; 6 else 7 return f(n-1)+n ; 8 } 9 10 int main() 11 { 12 int n; 13 scanf("%d",&n); 14 while(n--) 15 { 16 int m; 17 scanf("%d",&m); 18 int c=0; 19 int b=0; 20 for(int i=1;;i++) 21 if(f(i)>=m) 22 { 23 c=f(i)-m; 24 b=i; 25 break; 26 } 27 if(b%2!=0) 28 printf("%d/%d\n",c+1,b-c); 29 else 30 printf("%d/%d\n",b-c,c+1); 31 } 32 }
总结:
自己把它想复杂了,或者是自己一开始根本就束手无策没弄明白思路。
可以把这个图形右转45度,成一金字塔形状,每一行的分母和分子都与上一行有关系,并且每行的最大编号实际上就是前面所有分母的和。
当分母为奇数时,编号从左往右进行,当分母为偶数时,编号从右往左进行。
然后就OK了。