背景
...
...:“这个简单...我们还是去刚才的海边呗...”
...:"其实今晚...我是有一定要完成的事情的..." .,
威尼斯真的是一个美丽的城市...很小的时候我就听说这个地方..
这一天..从贝鲁特归来的商队..除了布匹和香辛料...还带来的东方的数字....
也有人曾经讨论过它们的历史...
只是很长时间这些都不被那些数学家们所重视..
人们怀着敬畏的心情..小心的审视着这些新奇的东西...
而它们..给生活在这片土地上的人们所带来的..是很大的帮助..
...
描述
写一个程序...可以实现在连分数和分数之间的互相转换...
限制
出题人不透露
提示
多组测试数据:
...每一个测试点有多组数据...数据的组数不超过100组...
对于Pascal里...可以这样子
while not eof do begin
...
end;
来实现这点..
(至于..C++里..我就不太清楚了...)
约分:
计算结果最后是要约分的...但是..在分数转向连分数的时候..
我们不保证输入的数据是约分.....
连分数的输入格式:
连分数的输入格式是按照wiki里写的...
第一个位置的分号应该是为了避免可能的歧义~..
English:
我们校内的时候又同学抱怨英文看不懂...可以访问这个页...蛮好用的...
或者在wiki左侧的语言栏里最下面找中文切换一下就行了...
Range:
数字的规模都很小...
也就是它们都不会超过longint范围里....
包括中间的数据...
连分数的项数也不会超过100项..
See also:
连分数的其它知识..可以阅读....至于这个.....
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
char map[5000000];
int main()
{
while(scanf("%s",map)!=EOF)
{
vector<int >a;
if(map[0]=='[')
{
int ll=strlen(map);
int i,j;
bool cc=0;
for(i=0;i<ll;i++)
{
if(map[i]>='0'&&map[i]<='9'&&cc==0)
{
cc=1;
int k=i;
int wc=0;
while(map[k]>='0'&&map[k]<='9')
{
wc=wc*10+(map[k]-'0');
k++;
}
a.push_back(wc);
}
else
{
cc=0;
}
}
if(a.size()==1)
{
printf("%d\n",a.back());
continue;
}
int h,l,g;
l=1;
g=a.back();
a.pop_back();
h=a.back();
a.pop_back();
h=h*g+l;
l=g;
g=h;//g 要作为分子 l 要做为分母
while(a.size()!=0)
{
h=a.back();
a.pop_back();
h=h*g+l;
l=g;
g=h;//g 要作为分子 l 要做为分母
}
printf("%d/%d\n",g,l);
}
else
{
int i=0,j;
int zuo,you=0;
zuo=0;
while(map[i]!='/')
{
zuo=zuo*10+(map[i]-'0');
i++;
}
i++;
while(map[i])
{
you=you*10+(map[i]-'0');
i++;
}
if(zuo%you==0)
{
printf("[%d]\n",zuo/you);
continue;
}
printf("[");
int cnm=zuo/you;
printf("%d;",zuo/you);
zuo=zuo-cnm*you;
int cf;
cf=zuo;
zuo=you;
you=cf;
while(1)
{
int cnm=zuo/you;
printf("%d",cnm);
if(you!=1&&zuo%you!=0)
{
printf(",");
}
zuo=zuo-cnm*you;
if(zuo==0)
break;
int cf;
cf=zuo;
zuo=you;
you=cf;
}
printf("]\n");
}
}
return 0;
}