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

GCD สูงสุดของจำนวนเต็ม N พร้อมผลิตภัณฑ์ที่กำหนดใน C++


สมมติว่าเราสองจำนวนเต็ม N และ P P คือผลคูณของจำนวนเต็มไม่ทราบจำนวน เราต้องหา GCD ที่เป็นไปได้สูงสุดของจำนวนเต็มเหล่านั้น สมมุติว่า N =3 และ P =24 จากนั้นกลุ่มต่างๆ จะเป็นเช่น {1, 1, 24}, {1, 2, 12}, {1, 3, 8}, {1, 4, 6}, {2 , 2, 6}, {2, 3, 4}. GCD คือ:1, 1, 1, 1, 2, 1 คำตอบคือ 2 ที่นี่

เราจะค้นหาปัจจัยเฉพาะทั้งหมดของ P และจัดเก็บไว้ในแฮชแมป จำนวนเต็ม N จะมีค่า GCD สูงสุดเมื่อตัวประกอบเฉพาะจะเหมือนกันในจำนวนเต็มทั้งหมด ดังนั้น ถ้า P =p1 k1 * p2 k2 * … * pn รู้ . ไพ คือตัวประกอบเฉพาะ จากนั้น GCD สูงสุดจะเป็น res =p1 k1/N * p2 k2/N * … * pn kn/N .

ตัวอย่าง

#include <iostream>
#include <cmath>
#include <unordered_map>
using namespace std;
long getMaxGCD(long N, long p) {
   int gcd = 1;
   unordered_map<int, int> prime_factors;
   for (int i = 2; i * i <= p; i++) {
      while (p % i == 0) {
         prime_factors[i]++;
         p /= i;
      }
   }
   if (p != 1)
      prime_factors[p]++;
   for (auto v : prime_factors)
      gcd = gcd * pow(v.first, v.second / N);
   return gcd;
}
int main() {
   long n = 3;
   long p = 24;
   cout << "MAX GCD: " << getMaxGCD(n, p);
}

ผลลัพธ์

MAX GCD: 2