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

นับตัวเลขในช่วงที่องค์ประกอบอาร์เรย์ทั้งหมดใน C++ . หารลงตัว


เรามีหมายเลข START และ END สองหมายเลขเพื่อกำหนดช่วงของตัวเลข และอาร์เรย์ของจำนวนบวก Arr[] ด้วย เป้าหมายคือการหาตัวเลขทั้งหมดที่หารด้วยองค์ประกอบทั้งหมดของ Arr[] และอยู่ในช่วง [START,END] .

วิธีที่ 1 ( วิธีไร้เดียงสา )

เราจะทำสิ่งนี้โดยข้ามผ่านตัวเลขจาก START ถึง END และสำหรับตัวเลขแต่ละตัว เราจะตรวจสอบว่าตัวเลขนั้นหารด้วยองค์ประกอบทั้งหมดของอาร์เรย์หรือไม่ ถ้าใช่ ให้นับเพิ่ม

วิธีที่ 2 ( ตรวจสอบการหารด้วย LCM ขององค์ประกอบอาร์เรย์ )

เราจะหา LCM ขององค์ประกอบอาร์เรย์ทั้งหมด จากนั้นตรวจสอบและนับตัวเลขทั้งหมดในช่วง [START,END] ที่ LCM นั้นหารลงตัวทั้งหมด

มาทำความเข้าใจกับตัวอย่างกัน

ป้อนข้อมูล

START=1 END=20 Arr[]= { 2, 4, 8 }

ผลผลิต

Numbers that are divisible by all array elements: 2

คำอธิบาย

Numbers 8 and 16 are in the range that are divisible by all array elements.

ป้อนข้อมูล

START=100 END=200 Arr[]= { 230, 321, 490, 521 }

ผลผลิต

Numbers that are divisible by all array elements: 0

คำอธิบาย

No number between 100 to 200 divisible by any array element.

วิธีที่ 1 ( วิธีไร้เดียงสา )

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

  • เราใช้จำนวนเต็ม START และ END เป็นตัวแปรช่วง

  • ฟังก์ชัน divisiblebyArr(int start, int end, int arr[], int len) รับตัวแปรช่วงและอาร์เรย์ และส่งกลับจำนวนตัวเลขที่หารด้วยองค์ประกอบอาร์เรย์ทั้งหมดได้

  • ใช้ตัวแปรเริ่มต้นนับเป็น 0 สำหรับตัวเลขดังกล่าว

  • ใช้แฟล็กตัวแปรเป็น 0

  • ข้ามช่วงของตัวเลขโดยใช้การวนซ้ำ i=start to i=end

  • ตอนนี้สำหรับแต่ละหมายเลข num=i ใช้ while loop ตรวจสอบว่าองค์ประกอบอาร์เรย์ทั้งหมดหารตัวเลขได้หรือไม่

  • หากองค์ประกอบทั้งหมดแบ่ง num ออกจนหมด ให้ตั้งค่า flag=1

  • ภายนอกในขณะที่ if flag=1 นับเพิ่มขึ้น

  • ที่ส่วนท้ายของการนับลูปทั้งหมดจะมีจำนวนทั้งหมดที่หารด้วยองค์ประกอบทั้งหมดของอาร์เรย์

  • คืนค่าการนับเป็นผลลัพธ์

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int divisiblebyArr(int start, int end, int arr[], int len){
   int count = 0;
   int flag=0;
   int index=0;
   for (int i = start; i <= end; i++){
      int num = i;
      index=0;
      while(index<len){
         if(num % arr[index++] == 0)
            { flag=1; }
         else{
            flag=0;
            break;
         }
      }
      if (flag == 1)
         { count++; }
      }
   return count;
}
int main(){
   int START = 5, END = 20;
   int Arr[] = {2,4,8 };
   int len=sizeof(Arr)/sizeof(Arr[0]);
   cout <<"Numbers that are divisible by all array elements: "<< divisiblebyArr(START,END,Arr,len);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

Numbers that are divisible by all array elements: 2

วิธีที่ 2 ( วิธี LCM )

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

  • เราใช้จำนวนเต็ม START และ END เป็นตัวแปรช่วง

  • ฟังก์ชัน getLCM(int a, int b) ใช้ตัวเลขสองตัวและส่งกลับค่า LCM ของตัวเลขนั้นโดยหาตัวเลขตัวแรกที่หารด้วย while loop ที่หารลงตัวทั้งสองตัว

  • ฟังก์ชัน getLCMArray(int arr[], int n) รับอาร์เรย์และความยาวเป็นอินพุตและส่งกลับ LCM ขององค์ประกอบทั้งหมดของอาร์เรย์

  • คำนวณ LCM แรกเป็น getLCM(arr[0], arr[1]) หลังจากนั้นให้ค้นหา lcm ของ lcm ก่อนหน้าและ arr[i] โดยเรียก getLCM(lcm, arr[i]) โดยที่ i=2 ถึง i

  • ฟังก์ชัน divisiblebyArr(int start, int end, int arr[], int len) รับตัวแปรช่วงและอาร์เรย์ และส่งกลับจำนวนตัวเลขที่หารด้วยองค์ประกอบอาร์เรย์ทั้งหมดได้

  • ใช้ตัวแปรเริ่มต้นนับเป็น 0 สำหรับตัวเลขดังกล่าว

  • ใช้ตัวแปร lcm เป็น getLCMArray(int arr[], int len)

  • ข้ามช่วงของตัวเลขโดยใช้การวนซ้ำ i=start to i=end

  • ตอนนี้สำหรับตัวเลข i แต่ละตัว ให้ตรวจสอบว่าหารลงตัวหรือไม่ lcm ถ้าเป็นจริง นับเพิ่ม

  • ที่ส่วนท้ายของการนับลูปทั้งหมดจะมีจำนวนทั้งหมดที่หารด้วยองค์ประกอบทั้งหมดของอาร์เรย์

  • คืนค่าการนับเป็นผลลัพธ์

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
int getLCM(int a, int b){
   int m;
   m = (a > b) ? a : b;
   while(true){
      if(m % a == 0 && m % b == 0)
         return m;
      m++;
   }
}
int getLCMArray(int arr[], int n){
   int lcm = getLCM(arr[0], arr[1]);
   for(int i = 2; i < n; i++){
      lcm = getLCM(lcm, arr[i]);
   }
   return lcm;
}
int divisiblebyArr(int start, int end, int arr[], int len){
   int count = 0;
   int flag=0;
   int lcm=getLCMArray(arr,len);
   for (int i = start; i <= end; i++){
      if(i%lcm==0)
         { count++; }
      }
   return count;
}
int main(){
   int START = 5, END = 20;
   int Arr[] = {2,4,8 };
   int len=sizeof(Arr)/sizeof(Arr[0]);
   cout <<"Numbers that are divisible by all array elements: "<< divisiblebyArr(START,END,Arr,len);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

Numbers that are divisible by all array elements: 2