Vijos P1696 数与连分数【连分数】

来源:互联网 发布:现代舞服装淘宝 编辑:程序博客网 时间:2024/05/17 22:10

背景

...

...:“这个简单...我们还是去刚才的海边呗...”
...:"其实今晚...我是有一定要完成的事情的..." .,
威尼斯真的是一个美丽的城市...很小的时候我就听说这个地方..

这一天..从贝鲁特归来的商队..除了布匹和香辛料...还带来的东方的数字....
也有人曾经讨论过它们的历史...
只是很长时间这些都不被那些数学家们所重视..

人们怀着敬畏的心情..小心的审视着这些新奇的东西...
而它们..给生活在这片土地上的人们所带来的..是很大的帮助..
...

描述

写一个程序...可以实现在连分数和分数之间的互相转换...

样例1

样例输入1

[2;3,7]51/22

样例输出1

51/22[2;3,7]

限制

出题人不透露

提示

多组测试数据:
...每一个测试点有多组数据...数据的组数不超过100组...
对于Pascal里...可以这样子
while not eof do begin
...
end;
来实现这点..
(至于..C++里..我就不太清楚了...)
约分:
计算结果最后是要约分的...但是..在分数转向连分数的时候..
我们不保证输入的数据是约分.....
连分数的输入格式:
连分数的输入格式是按照wiki里写的...
第一个位置的分号应该是为了避免可能的歧义~..
English:
我们校内的时候又同学抱怨英文看不懂...可以访问这个页...蛮好用的...
或者在wiki左侧的语言栏里最下面找中文切换一下就行了...
Range:
数字的规模都很小...
也就是它们都不会超过longint范围里....
包括中间的数据...
连分数的项数也不会超过100项..
See also:
连分数的其它知识..可以阅读....至于这个.....


问题链接:Vijos P1696 数与连分数

问题分析

连分数与分之间相互转换问题。

需要了解和掌握有关连分数的概念与表示方式,可以查看中英文版的维基百科的“连分数”。

剩下的就是简单的分数计算问题了。

程序说明

需要考虑特例的情况。例如,连分数只有a0的情况,分数的分母为1的情况。

程序中不考虑约分的问题。

程序中的迭代计算问题尽可能地简洁。

题记

把功能封装到函数是一种好的做法,程序逻辑更加简洁。

做分数题,又回到少年时代的感觉。


参考链接:(略)


AC的C++程序如下:

#include <iostream>#include <cstdio>#include <cctype>#include <string>#include <vector>using namespace std;string s;void continuedfraction2fraction(string& s){    int i=1;    vector<int> a;    while(s[i] != ']') {        if(isdigit(s[i])) {            int v = 0;            while(isdigit(s[i])) {                v *= 10;                v += s[i] - '0';                i++;            }            a.push_back(v);        } else            i++;    }    if(a.size() == 1)        printf("%d\n", a.back());    else {        int n, d;        n = a.back();        d = 1;        a.pop_back();        while(a.size() != 0) {            swap(n, d);            n = a.back() * d + n;            a.pop_back();        }        printf("%d/%d\n", n, d);    }}void fraction2continuedfraction(int n, int d){    int nextd;    char separator = ';';    if(n % d == 0)        printf("[%d]\n", n / d);    else {        printf("[");        printf("%d", n / d);        nextd = n % d;        n = d;        d = nextd;        while(d != 0) {            printf("%c", separator);            printf("%d", n / d);            nextd = n % d;            n = d;            d = nextd;            separator = ',';        }        printf("]\n");    }}int main(){    while(getline(cin, s)) {        if(s[0] == '[') {            continuedfraction2fraction(s);        } else {            int numerator, denominator;            sscanf(&s[0], "%d/%d", &numerator, &denominator);            fraction2continuedfraction(numerator, denominator);        }    }    return 0;}




原创粉丝点击