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

背景

...

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

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

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

描述

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

样例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;
}




# ContinuedFraction #### 项目介绍 连分数计算器 支持连分数和小输入,高精度小连分数,无精度损失,用于获取小在一定范围内最接近的分 例如π的高精度转连分数 str=> 3.14159265358979 num=> 3.14159265358979000000000000000000000 ctf=> [3;7,15,1,292,1,1,1,2,1,3,1,12,2,4,1,1,3,2,2,1,18,1,2,2,1,7,2,2] 1=> 3.00000000000000000000000000000000000 3 3/1 2=> 3.14285714285714285714285714285714286 7 22/7 3=> 3.14150943396226415094339622641509434 15 333/106 4=> 3.14159292035398230088495575221238938 1 355/113 5=> 3.14159265301190260407226149477372968 292 103993/33102 6=> 3.14159265392142104470871594159265392 1 104348/33215 7=> 3.14159265346743670552045478534915632 1 208341/66317 8=> 3.14159265361893662339750030141060162 1 312689/99532 9=> 3.14159265358107777120441930658185778 2 833719/265381 10=> 3.14159265359140397848254241421927966 1 1146408/364913 11=> 3.14159265358938917154368732170690821 3 4272943/1360120 12=> 3.14159265358981538324194377730744861 1 5419351/1725033 13=> 3.14159265358978910556761228975786423 12 69305155/22060516 14=> 3.14159265358979009430798477470203822 2 144029661/45846065 15=> 3.14159265358978998813773682909318658 4 645423799/205444776 16=> 3.14159265358979000750767514045607416 1 789453460/251290841 17=> 3.14159265358978999879486079142367388 1 1434877259/456735617 18=> 3.14159265358979000014512509093352444 3 5094085237/1621497692 19=> 3.14159265358978999997843356720301190 2 11623047733/3699731001 20=> 3.14159265358979000000839600248412328 2 28340180703/9020959694 21=> 3.14159265358978999999968162106153623 1 39963228436/12720690695 22=> 3.14159265358979000000001193310441815 18 747678292551/237993392204 23=> 3.14159265358978999999999517378526962 1 787641520987/250714082899 24=> 3.14159265358979000000000056801156993 2 2322961334525/739421558002 25=> 3.14159265358978999999999978607241192 2 5433564190037/1729557198903 26=> 3.14159265358979000000000002025128805 1 7756525524562/2468978756905 27=> 3.14159265358978999999999999894805542 7 59729242861971/19012408497238 28=> 3.14159265358979000000000000024695141 2 127215011248504/40493795751381 29=> 3.14159265358979000000000000000000000 2 314159265358979/100000000000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值