zoukankan      html  css  js  c++  java
  • 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
    ", 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, d);
        }
    }
    
    void fraction2continuedfraction(int n, int d)
    {
        int nextd;
        char separator = ';';
    
        if(n % d == 0)
            printf("[%d]
    ", 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("]
    ");
        }
    }
    
    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;
    }




  • 相关阅读:
    vs2008 服务器控件库
    dropdoenlist 设置默认值
    .NET用HttpFileCollection实现多文件上传
    dropdownlist 绑定
    简单的webservice调用(天气预报)
    统计在线人数
    多文件上传
    dropdownlist1 绑定 value值
    WMI 脚本入门:第一部分 (MSDN)
    WMI 脚本入门:第三部分 (MSDN)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563750.html
Copyright © 2011-2022 走看看