- 数与连分数
- 2017-07-02 10:48:14 @
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 10100
using namespace std;
char s[MAXN];
int a[MAXN],n;
bool real;
inline void go() {
real=false;
int FZ=1,FM=0;
int x=0,len=strlen(s),l=0;
for(int i=len-1;i>=0;i--) {
if(s[i]>='0'&&s[i]<='9') x=x*10+s[i]-48;
if(s[i]==','||s[i]==';') {
real=true;
if(!FM) FM=x;
else {
x=x*FM;
FZ+=x;
int t=FM;
FM=FZ;
FZ=t;
}
x=0;
}
if(s[i]=='[') {
l=x;
x=x*FM;
FZ+=x;
break;
}
}
if(!real) printf("%d\n",l);
else {
int p=__gcd(FZ,FM);
if(FM/p==1) printf("%d\n",FZ/p);
else printf("%d/%d\n",FZ/p,FM/p);
}
return;
}
inline void GO(){
n=0;
int FZ=0,FM=0;
int x=0,len=strlen(s);
for(int i=0;i<len;i++) {
if(s[i]>='0'&&s[i]<='9') x=x*10+s[i]-48;
if(s[i]=='/') {
FZ=x;
x=0;
}
}
FM=x;
while(true) {
if(FM==0||FM==1) {
a[++n]=FZ;
break;
}
a[++n]=FZ/FM;
FZ-=a[n]*FM;
int t=FZ;
FZ=FM;
FM=t;
}
if(n==1) printf("[%d]\n",a[1]);
else {
printf("[%d:",a[1]);
for(int i=2;i<n;i++) printf("%d,",a[i]);
printf("%d]",a[n]);
}
return;
}
int main() {
while(scanf("%s",s)!=EOF){
if(s[0]=='[') go();
else GO();
}
return 0;
}