描述
写一个程序...可以实现在连分数和分数之间的互相转换...
样例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 #include2 #include 3 #include 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 }