ในบทช่วยสอนนี้ เราจะเขียนโปรแกรมที่ค้นหาตัวเลขโดยที่โมดูลัสขององค์ประกอบแต่ละอาร์เรย์จะเหมือนกัน มาดูตัวอย่างกัน
ป้อนข้อมูล − arr ={10, 4, 2}
ผลผลิต − 1 2
หากมีตัวเลขสองตัว x, y และ x> y , สมมติว่า x - y =d.
จากนั้น x =y + d .
สมมติว่าเรามีตัวเลข k โดยที่ x%k =y%k ใช้โมดูลัส k สำหรับสมการข้างต้นแล้วหาค่า d .
x%k = (y+d)%k y%k = y%k +d%k d%k = 0
จากการคำนวณข้างต้น ถ้าตัวเลข k เป็นตัวหารความแตกต่างระหว่าง x และ ย . จากนั้นจะเป็นตัวหารของตัวเลข x และ ย .
ลองใช้แนวคิดเดียวกันกับอาร์เรย์ขององค์ประกอบ และหาค่า k ดูขั้นตอนการแก้ปัญหา
-
เริ่มต้นอาร์เรย์ด้วยตัวเลข
-
ที่นี่ d จะเป็นความแตกต่างระหว่างค่าสูงสุดและต่ำสุดขององค์ประกอบอาร์เรย์
-
จัดเรียงค่าของอาร์เรย์โดยใช้วิธีการจัดเรียง
-
ค้นหาความแตกต่างระหว่างตัวเลขสุดท้ายและตัวแรก
-
หากผลต่างเป็นศูนย์ แสดงว่าตัวเลขทั้งหมดเหมือนกัน จากนั้นผลลัพธ์ของโมดูลที่มีตัวเลขใด ๆ จะให้ผลลัพธ์เหมือนกัน
-
หาตัวหารของจำนวน d . และเก็บเอาไว้
-
วนซ้ำตัวหารทั้งหมดและค้นหาจำนวนที่มีโมดูโลที่มีองค์ประกอบอาร์เรย์เหมือนกัน
ตัวอย่าง
มาดูโค้ดกันเลย
#include <bits/stdc++.h>
using namespace std;
void findNumbers(int arr[], int n) {
sort(arr, arr + n);
int d = arr[n - 1] - arr[0];
// check whether all elements are same or not
if (d == 0) {
cout << "Infinite number of k's";
return;
}
// finding the divisors of d
vector <int> v;
for (int i = 1; i * i <= d; i++) {
if (d % i == 0) {
v.push_back(i);
if (i != d / i) {
v.push_back(d / i);
}
}
}
// findind the k's
for (int i = 0; i < v.size(); i++) {
int temp = arr[0] % v[i];
int j;
for (j = 1; j < n; j++) {
if (arr[j] % v[i] != temp) {
break;
}
}
if (j == n)
cout << v[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {10, 4, 2};
findNumbers(arr, 3);
return 0;
} ผลลัพธ์
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้ผลลัพธ์ดังต่อไปนี้
1 2
บทสรุป
หากคุณมีข้อสงสัยใดๆ ในบทแนะนำ โปรดระบุในส่วนความคิดเห็น