Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Factor Combinations ใน C++


สมมติว่ามีตัวเลข ตัวเลขสามารถมองว่าเป็นผลคูณของตัวประกอบได้ เช่น 8 = 2 x 2 x 2; = 2 x 4 เราต้องทำฟังก์ชันที่รับจำนวนเต็ม n และคืนค่าการรวมตัวประกอบที่เป็นไปได้ทั้งหมด

เช่น ถ้าอินพุทเป็น 12 ผลลัพธ์จะเป็น [[2, 6], [2, 2, 3], [3, 4]]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −

  • กำหนดฟังก์ชัน solve() รับ n, target, start

  • กำหนดรายการรายการ ret

  • ถ้า n เท่ากับ 1 แล้ว −

    • คืนค่า ret

  • ถ้า n ไม่เท่ากับ target แล้ว −

    • แทรก n ที่ท้ายของ ret

  • ลูป i := start ถึง i * i <= n เพิ่ม i ทำ −

    • ถ้า n mod i เท่ากับ 0 แล้ว −

      • other = solve(n / i, target, i)

      • ลูป j := 0 ถึงขนาดของ other-1 ทำ −

        • แทรก i ที่ท้ายของ other[j]

        • แทรก other[j] ที่ท้ายของ ret

  • คืนค่า ret

  • จากเมธอดหลักทำดังนี้ −

  • คืนค่า solve(n, n, 2)

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){    cout << "[";    for(int i = 0; i<v.size(); i++){       cout << "[";       for(int j = 0; j <v[i].size(); j++){          cout << v[i][j] << ", ";       }       cout << "],";    }    cout << "]"<<endl; } class Solution { public:    vector < vector <int> > solve(int n, int target, int start){       vector < vector <int> > ret;       if(n == 1){          return ret;       }       if(n != target){          ret.push_back({n});       }       for(int i = start; i * i <= n; i++){          if(n % i == 0){             vector < vector <int> > other = solve(n / i, target,i);             for(int j = 0; j < other.size(); j++){                other[j].push_back(i);                ret.push_back(other[j]);             }          }       }       return ret;    }    vector<vector<int>> getFactors(int n) {       return solve(n, n, 2);    } }; main(){    Solution ob;    print_vector(ob.getFactors(16)); }

อินพุท

16

เอาต์พุท

[[8, 2, ],[4, 2, 2, ],[2, 2, 2, 2, ],[4, 4, ],]