Vijos p1696 数与连分数
描述
写一个程序...可以实现在连分数和分数之间的互相转换...
样例1
样例输入1
[2;3,7]
51/22
样例输出1
51/22
[2;3,7]
限制
出题人不透露
提示
多组测试数据:
...每一个测试点有多组数据...数据的组数不超过100组...
约分:
计算结果最后是要约分的...但是..在分数转向连分数的时候..
我们不保证输入的数据是约分.....
连分数的输入格式:
连分数的输入格式是按照wiki里写的...
第一个位置的分号应该是为了避免可能的歧义~..
English:
我们校内的时候又同学抱怨英文看不懂...可以访问这个页...蛮好用的...
或者在wiki左侧的语言栏里最下面找中文切换一下就行了...
Range:
数字的规模都很小...
也就是它们都不会超过longint范围里....
包括中间的数据...
连分数的项数也不会超过100项..
思路
对分数化连分数和连分数化分数分别思考,连分数化分数则为从后到前:相加然后取倒数;反过来更简单。
注意点:输出格式,2->[2] [2]->2 分数化简(求下最大公约数)
代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void swap(int *, int *); 6 int gcd(int, int); 7 8 int main() { 9 char s[1000]; 10 int len,i; 11 int fz=0,fm=0; 12 13 while (scanf("%s", s) != EOF) { 14 len = strlen(s); 15 if (s[len-1]=='\n') s[len-1]='\0'; 16 if (s[0]=='[') { 17 18 if (len==3 || len==4) printf ("%c\n",s[1]); 19 else { 20 fz=s[len-2]-'0'; 21 fm=1; 22 for (i=len-4;i>=1;i-=2) { 23 swap(&fm,&fz); 24 fz=fz+fm*(s[i]-'0'); 25 } 26 int g=gcd(fz,fm); 27 fz=fz/g; 28 fm=fm/g; 29 printf ("%d/%d\n",fz,fm); 30 } 31 } 32 else { 33 int k=0; 34 if (!strchr(s,'/')) { 35 printf ("[%s]\n",s); 36 } 37 else { 38 sscanf (s,"%d/%d",&fz,&fm); 39 int g=gcd(fz,fm); 40 fz=fz/g; 41 fm=fm/g; 42 printf ("["); 43 while (fz!=1) { 44 if (k==1) printf (";"); 45 else if (k) printf (","); 46 int num=fz/fm; 47 printf ("%d",num); 48 k++; 49 fz=fz-num*fm; 50 swap(&fz,&fm); 51 } 52 printf ("]\n"); 53 } 54 } 55 } 56 system("pause"); 57 return 0; 58 } 59 60 void swap(int *a, int *b) { 61 int tmp; 62 tmp = *a; 63 *a = *b; 64 *b = tmp; 65 } 66 67 int gcd(int a,int b) { 68 while (a!=b) { 69 if (a>b) a = a - b; 70 else b = b - a; 71 } 72 return a; 73 }