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 }

 

posted @ 2018-02-27 01:52  yachen2018  阅读(195)  评论(0编辑  收藏  举报