เราได้รับอินพุต N เป้าหมายคือการหาคู่ทั้งหมดของ A, B โดยที่ 1<=A<=N และ 1<=B<=N และ GCD(A, B) คือ B ทุกคู่มีค่ามากที่สุด ตัวหารร่วมเป็น B.
ให้เราเข้าใจด้วยตัวอย่าง
ป้อนข้อมูล − N=5
ผลผลิต − นับจำนวนคู่ (A <=N, B <=N) โดยที่ gcd (A , B) คือ B เท่ากับ − 10
คำอธิบาย
pairs (A <= N, B <= N) such that gcd (A , B) is B are − (1,1), (2,1),(3,1),(4,1),(5,1),(2,2),(3,3),(4,2),(4,4), (5,5). Total 10.
ป้อนข้อมูล − N=50
ผลผลิต − นับจำนวนคู่ (A <=N, B <=N) โดยที่ gcd (A , B) เป็น B คือ − 207
คำอธิบาย
pairs (A <= N, B <= N) such that gcd (A , B) is B are : (1,1), (2,1),(3,1),(4,1),(5,1).....(50,1) (2,2),(3,3),(4,4).....(50,50)
คู่อื่นๆ เช่น (4,2), (6,3), (8,2),(8,4),...........(50,25) รวม 207
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
อาจมีหลายวิธีในการแก้ปัญหาที่กำหนด เช่น แนวทางไร้เดียงสาและแนวทางที่มีประสิทธิภาพ มาดูแนวทางไร้เดียงสากันก่อน .
-
ใช้จำนวนเต็ม N เป็นอินพุต
-
ฟังก์ชัน GCD(int A, int B) รับจำนวนเต็มสองจำนวนและส่งกลับตัวหารร่วมมากของ A และ B โดยจะคำนวณ gcd แบบเรียกซ้ำ
-
หาก A หรือ B เป็น 0 ให้คืนค่าอื่น หากทั้งสองมีค่าเท่ากัน ให้คืนค่าใดค่าหนึ่งจากสองค่า ถ้า A>B กลับ (A-B,B) ถ้า B มากกว่า ให้คืนค่า gcd(B-A,A) ในที่สุดเราก็ได้ค่า gcd
-
ฟังก์ชัน count_pairs(int N) รับ N และส่งกลับจำนวนคู่เพื่อให้เป็นคู่ (A,B), B คือ gcd และทั้งคู่อยู่ในช่วง[1,N]
-
ใช้ค่าเริ่มต้นเป็น count =0 สำหรับจำนวนของคู่ดังกล่าว
-
สำหรับแต่ละค่าของคู่ รัน for loop i=1 to i=N for A และ nested for loop j=1 t j=N for B.
-
สร้างคู่ (i,j) และส่งต่อไปยัง GCD(i,j) ถ้าผลลัพธ์เท่ากับ j จำนวนที่เพิ่มขึ้น
-
ที่ส่วนท้ายของทั้งสองลูปจะนับเป็นผลลัพธ์
แนวทางที่มีประสิทธิภาพ
อย่างที่เราเห็น gcd(a,b)=b หมายความว่า a เป็นจำนวนทวีคูณของ b เสมอ ทวีคูณดังกล่าวทั้งหมดของ b(1<=b<=N) ที่น้อยกว่า N จะสร้างคู่ สำหรับจำนวน i หากทวีคูณของ i น้อยกว่าชั้น (N/i) จะถูกนับ
-
ฟังก์ชัน count_pairs(int N) รับ N และส่งกลับจำนวนคู่เพื่อให้เป็นคู่ (A,B), B คือ gcd และทั้งคู่อยู่ในช่วง[1,N]
-
ใช้ค่าเริ่มต้นเป็น count =0 สำหรับจำนวนของคู่ดังกล่าว
-
ใช้ตัวแปรชั่วคราว temp=N และ i=1
-
ใช้ while (i<=N) ติดตาม
-
สำหรับแต่ละฉันคำนวณขีด จำกัด ของทวีคูณเป็น j=N/temp
-
จำนวนคู่สำหรับปัจจุบัน i จะเป็น temp*(i-j+1) เพิ่มนับ
-
ตั้งค่า i=j+1 สำหรับ B ถัดไปของ (A,B)
-
ตั้งค่า temp=N/i สำหรับการทำซ้ำครั้งต่อไป
-
ในตอนท้ายของลูป while ให้นับผลลัพธ์กลับมา
ตัวอย่าง(วิธีการไร้เดียงสา)
#include <iostream>
using namespace std;
int GCD(int A, int B){
if (A == 0){
return B;
}
if (B == 0){
return A;
}
if (A == B){
return A;
}
if (A > B){
return GCD(A-B, B);
}
return GCD(A, B-A);
}
int count_pairs(int N){
int count = 0;
for(int i=1; i<=N; i++){
for(int j = 1; j<=N; j++){
if(GCD(i, j)==j){
count++;
}
}
}
return count;
}
int main(){
int N = 4;
cout<<"Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: "<<count_pairs(N);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: 8
ตัวอย่าง (แนวทางที่มีประสิทธิภาพ)
#include <bits/stdc++.h>
using namespace std;
int Count_pairs(int N){
int count = 0;
int temp = N;
int i = 1;
while(i <= N){
int j = N / temp;
count += temp * (j - i + 1);
i = j + 1;
temp = N / i;
}
return count;
}
int main(){
int N = 4;
cout<<"Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: "<<Count_pairs(N);
return 0;
} ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count number of pairs (A <= N, B <= N) such that gcd (A , B) is B are: 8