- 数与连分数
- 2021-11-07 13:57:06 @
#include <iostream>
#include <cstring>
using namespace std;
void swap(int &a,int &b)
{
int t;
t=a;
a=b;
b=t;
}
int gcd(int a,int b) //greatest common divisor最大公约数
{ if(a<b)
swap(a,b);
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{ string str;
int a[10000]={
0,0,0
},b[10000];
while(getline(cin,str))
{
int l=str.length();
if(str[0]=='[')//连分数
{ int j=0,isNum=0;
int fz=0,fm=1,n;
for(int i=0;i<l;i++)
{ n=0;
isNum=0;
while(str[i]>='0'&&str[i]<='9')
{ isNum=1;
n=(str[i]-'0')+n*10;
i++;
}
if(isNum==1)
b[j++]=n;
}
j--;
for(int i=j;i>0;i--)
{
fz+=fm*b[i];
swap(fz,fm);
}
fz+=fm*b[0];
int gg=gcd(fz,fm);
fz=fz/gg;
fm=fm/gg;
if(fm==1)
cout<<fz<<endl;
else
cout<<fz<<"/"<<fm<<endl;
}
else{
int i=0,fz,fm=1,n=0,isfm=0;
while(str[i])
{
if(str[i]=='/')
{ fz=n;
n=0;
i++;
isfm=1;
continue;
}
n=(str[i]-'0')+n*10;
i++;
}
if(isfm==1)
fm=n;
else
{
fz=n;
fm=1;
}
int j=0;
while(1)
{int t=fz/fm;
a[j++]=t;
fz=fz-t*fm;
if(fz==0)
{
break;
}
swap(fz,fm);
}
for(int i=0;i<j;i++)
{
if(i==0)
{
cout<<"["<<a[i];
}
else if(i==1)
cout<<";"<<a[i];
else{
cout<<","<<a[i];
}
}
cout<<"]"<<endl;;
}
}
return 0;
}