题解 | #将真分数分解为埃及分数#

将真分数分解为埃及分数

https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b

思路:

寻找一个合适的比例,原a/b, 找到一个c,新a*c/b*c。假设c的范围[2, b]

即转化为:在b*c的众多因子中,寻找部分因子和 == a*c

(1) 遍历c,找到b*c的所有因子并保存。因子定义域[1, b*c],当满足b * c % k == 0时,保存;

(2) 对所有因子进行部分求和,是否满足其和 == a*c,即是否存在解路径

    dfs函数进行操作。保存中间路径。

#include <iostream>
#include <vector>
#include <sstream>
#include <cmath>
using namespace std;

/*
<花费时间:1.08h>
*/

vector<int> ans_path;
bool find_path(vector<int>& inte, int res, int i, int target, vector<int> path){
    // cout << "find_path_i: " << i << endl;
    bool ans = false;
    if(i == inte.size()){
        if(res == target) {
            ans_path = path;
            return true;
        }
        return false;
    }
    vector<int> cur_path = path;
    cur_path.push_back(i);
    ans |= find_path(inte, res + inte[i], i + 1, target, cur_path);

    // 不取
    ans |= find_path(inte, res, i+1, target, path);
    return ans;


}

int main() {
    string s;
    while(cin >> s){
        istringstream ss(s);
        vector<int> inte;
        string tmp;
        while(getline(ss, tmp, '/')){
            // cout << tmp << endl;
            inte.push_back(stoi(tmp));
        }

        // 遍历寻找,找到一个合适的放大因子
        for(int c = 2; c <= inte[1]; c ++){
            int new_mom = inte[1] * c;

            vector<int> cur_yinzi;
            for(int i = 1; i < new_mom; i++){
                if(new_mom % i == 0) cur_yinzi.push_back(i);
            }

            // 观察因子和是否,找到inte[0]*c的解。
            int cur_sum = 0;
            for(auto in : cur_yinzi) cur_sum += in;
            if(cur_sum < inte[0] * c) continue;

            vector<int> tmp_path;
            // cout << cur_yinzi.size() << endl;
            find_path(cur_yinzi, 0, 0, inte[0] * c, tmp_path);
            // cout << ans_path.size() << endl;
            if(ans_path.size() != 0){
                for(int j = 0; j < ans_path.size(); j++){
                    // cout << cur_yinzi[ans_path[j]] << endl;
                    cout << "1/" << to_string(inte[1] * c / cur_yinzi[ans_path[j]]);
                    if(j != ans_path.size() - 1) cout << "+";
                }
                cout << endl;
                break;
            }

        }

    }



}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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