题解 | #连分数#

连分数

https://www.nowcoder.com/practice/8e225697ad4043b5a2669f890ae90974

该问题最适合采用迭代或递归式的欧几里得算法(Euclidean Algorithm)。连分数的每一层系数项 正好对应于执行 时的整数商。

对于分数

  1. ,余数
  2. 重复上述过程处理 ,直到余数为 0。
  • 整除情况:如果初始 ,则只需输出 的商,无需后续的 结构。
  • 终止条件:当当前分母能被分子整除时,最后一段不再产生新的分数嵌套。例如 7/3 变为 2 + 1/3 而非 2 + 1/{3 + 1/{...}}

复杂度分析

  • 时间复杂度。 连分数的项数等同于欧几里得算法的步数。根据拉梅定理(Lamé's Theorem),辗转相除法的步数与输入数字的位数呈线性关系,即对数级增长。
  • 空间复杂度。 由于需要构造嵌套字符串,递归调用的深度或存储系数的栈空间与步数一致。

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void solve(ll P, ll Q) {
    ll k = P / Q;
    ll r = P % Q;

    cout << k;
    if (r != 0) {
        if (Q % r == 0)
            cout << "+1/" << Q / r;
        else {
            cout << "+1/{";
            solve(Q, r);
            cout << "}";
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    if (!(cin >> T)) return 0;

    while (T--) {
        ll P, Q;
        if (cin >> P >> Q) {
            cout << P << "/" << Q << " = ";
            solve(P, Q);
            cout << "\n";
        }
    }
    return 0;
}
#三月的小目标#
每日一题@牛客网 文章被收录于专栏

牛客网每日一题

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
02-28 13:25
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务