เราได้รับตัวแปรอินพุตสามตัวคือ 'start', 'end' และ 'number' เป้าหมายคือหาคู่ของตัวเลขระหว่าง start และ end ที่มีค่า GCD เท่ากับ 'number' เช่น GCD(A,B)=number และทั้ง A, B อยู่ในช่วง [start,end]
มาดูตัวอย่าง
อินพุต − start=5 end=20 number=8
เอาต์พุต − จำนวนคู่จำนวนธรรมชาติที่มี GCD เท่ากับตัวเลขที่กำหนด คือ 3
คำอธิบาย − คู่ระหว่าง 5 ถึง 20 ที่ GCD เป็น 8 คือ − (8,8), (8,16), (16,8)
อินพุต − start=5 end=20 number=7
เอาต์พุต − จำนวนคู่จำนวนธรรมชาติที่มี GCD เท่ากับตัวเลขที่กำหนด คือ 2
คำอธิบาย − คู่ระหว่าง 20 ถึง 30 ที่ GCD เป็น 7 คือ − (21,28), (28,21)
แนวทางที่ใช้ในโปรแกรม
เราจะใช้สองวิธี วิธีแรกแบบง่ายที่เราจะเดินทางด้วยลูป FOR จาก i=start ถึง i<=end และลูปในจาก j=start ถึง j<=end สำหรับแต่ละคู่ (i,j) ตรวจสอบถ้า GCD(i,j)==number ถ้าจริงเพิ่ม count
- รับตัวแปร
start, end, numberเป็นจำนวนเต็ม - ฟังก์ชัน
GCD(int a, int b)แบบเรียกซ้ำ คืน GCD ของอาร์กิวเมนต์ a,b ที่ส่งมา - ถ้า
bไม่เป็นศูนย์ เรียกตัวเองซ้ำเป็นGCD(b,a%b)มิฉะนั้นคืนa - ฟังก์ชัน
GCD_pairs(int start, int end, int number)รับตัวแปรขอบเขต start, end และตัวแปร number คืนคู่ระหว่าง start และ end ที่มี gcd=number - กำหนด
countเริ่มต้น 0 - ใช้ลูป FOR สองชั้นสำหรับแต่ละสมาชิกของคู่ ลูปนอกจาก
i=startถึงi<=endและลูปในจากj=startถึงj<=end - ตรวจสอบถ้าสำหรับคู่
(i,j),GCD(i,j)==numberถ้าจริง เพิ่มcount - ท้ายสุดเราจะได้จำนวนคู่ทั้งหมดที่มี gcd=number
- คืน
count
แนวทางที่มีประสิทธิภาพ
ในแนวทางนี้ เราจะอัปเดตค่าของ start และ end สำหรับคู่ (i,j) ให้มี gcd=number ทั้ง i,j ควรหารด้วย 'number' ลงตัว จะมีสูงสุด (end-start)/number ตัวเลขที่จะหาร 'number' ลงตัว เพื่อรับตัวเลขระหว่าง start และ end ที่หาร 'number' ลงตัว เราจะเดินทางจาก start = (start + number - 1) / number ถึง end = end / number ดังนั้นสำหรับตัวเลขแต่ละตัว หาก gcd(i,j)==1 ให้เพิ่ม count สำหรับคู่ (i,j) นั้น
- รับตัวแปร
start, end, numberเป็นจำนวนเต็ม - อัปเดต
start = (start+number - 1)/numberและend=end/number - ฟังก์ชัน
GCD(int a, int b)แบบเรียกซ้ำ คืน GCD ของอาร์กิวเมนต์ a,b - ถ้า
bไม่เป็นศูนย์ เรียกตัวเองซ้ำเป็นGCD(b,a%b)มิฉะนั้นคืนa - ฟังก์ชัน
GCD_pairs(int start, int end, int number)รับตัวแปรขอบเขต start, end และตัวแปร number คืนคู่ระหว่าง start และ end ที่มี gcd=number - กำหนด
countเริ่มต้น 0 - ใช้ลูป FOR สองชั้นสำหรับแต่ละสมาชิกของคู่ ลูปนอกจาก
i=startถึงi<=endและลูปในจากj=startถึงj<=end - ตรวจสอบถ้าสำหรับคู่
(i,j),GCD(i,j)==1ถ้าจริง เพิ่มcount - ท้ายสุดเราจะได้จำนวนคู่ทั้งหมดที่มี gcd=number
- คืน
count
ตัวอย่าง (วิธีง่าย)
#include <bits/stdc++.h>
using namespace std;
int GCD(int a, int b){
return b ? GCD(b, a % b) : a;
}
int GCD_pairs(int start, int end, int number){
int count = 0;
for (int i = start; i <= end; i++){
for (int j = start; j <= end; j++){
if (GCD(i, j) == number){
count++;
}
}
}
return count;
}
int main(){
int start = 10, end = 30, number = 10;
cout<<"Count of pairs of natural numbers with GCD equal to given number are: "<<GCD_pairs(start, end, number) << endl;
return 0;
}
เอาต์พุต
หากรันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −
Count of pairs of natural numbers with GCD equal to given number are: 7
ตัวอย่าง (แนวทางมีประสิทธิภาพ)
#include <bits/stdc++.h>
using namespace std;
int GCD(int a, int b){
return b ? GCD(b, a % b) : a;
}
int GCD_pairs(int start, int end, int number){
int count = 0;
for (int i = start; i <= end; i++){
for (int j = start; j <= end; j++){
if (GCD(i, j) == 1){
count++;
}
}
}
return count;
}
int main(){
int start = 10, end = 30, number = 10;
start = (start + number - 1) / number;
end = end / number;
cout<<"Count of pairs of natural numbers with GCD equal to given number are: "<<GCD_pairs(start, end, number) << endl;
return 0;
}
เอาต์พุต
หากรันโค้ดด้านบนจะได้ผลลัพธ์ดังนี้ −
Count of pairs of natural numbers with GCD equal to given number are: 7