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

นับคู่ของจำนวนธรรมชาติด้วย GCD เท่ากับจำนวนที่กำหนดใน C++


เราให้ตัวแปรอินพุตสามตัวเป็น 'start', 'end' และ 'number' เป้าหมายคือการหาคู่ของตัวเลขระหว่างจุดเริ่มต้นและจุดสิ้นสุดที่มีค่า 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 loop จาก i=start ถึง i<=end และ inner loop จาก j=start ถึง j<=end สำหรับแต่ละคู่ (i,j) ตรวจสอบว่า GCD(i,j)==number. ถ้านับเพิ่มจริง

  • นำตัวแปร 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 และตัวแปรจำนวน และส่งคืนคู่ระหว่างจุดเริ่มต้นและจุดสิ้นสุดที่มี gcd=number

  • นับเริ่มต้นเป็น 0

  • ใช้ two for loops สำหรับแต่ละสมาชิกของคู่ วงนอกจาก i=start ถึง i<=end และวงในจาก j=start ถึง j<=end.

  • ตรวจสอบว่าหาคู่ (i,j), GCD(i,j)==number. ถ้าเป็นจริง นับเพิ่ม

  • สุดท้ายเราจะได้จำนวนคู่ทั้งหมดที่มี gcd=number

  • ผลตอบแทนนับเป็นผลลัพธ์

แนวทางที่มีประสิทธิภาพ

ในแนวทางนี้ เราจะอัปเดตค่าของจุดเริ่มต้นและจุดสิ้นสุด สำหรับ pair(i,j) จะมี gcd=number ทั้ง i,j ควรหารด้วย ‘number. จะมีมากที่สุด (สิ้นสุด)/หมายเลข ที่จะแบ่ง 'หมายเลข' ทั้งหมด เพื่อให้ได้ตัวเลขระหว่างจุดเริ่มต้นและจุดสิ้นสุดที่หารด้วย 'ตัวเลข' เราจะสำรวจจากจุดเริ่มต้น =(เริ่มต้น + หมายเลข - 1) / หมายเลขไปยังจุดสิ้นสุด =สิ้นสุด / หมายเลข ดังนั้นสำหรับตัวเลขแต่ละตัวนั้น ถ้า gcd(i,j)==1 ให้นับเพิ่มขึ้นสำหรับคู่นั้น (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 และตัวแปรจำนวน และส่งคืนคู่ระหว่างจุดเริ่มต้นและจุดสิ้นสุดที่มี gcd=number

  • นับเริ่มต้นเป็น 0

  • ใช้ two for loops สำหรับแต่ละสมาชิกของคู่ วงนอกจาก i=start ถึง i<=end และวงในจาก j=start ถึง j<=end.

  • ตรวจสอบว่าคู่ (i,j), GCD(i,j)==1. ถ้าเป็นจริง นับเพิ่ม

  • สุดท้ายเราจะได้จำนวนคู่ทั้งหมดที่มี gcd=number

  • ผลตอบแทนนับเป็นผลลัพธ์

ตัวอย่าง (แนวทางไร้เดียงสา)

#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