pembahagi sepunya terbesar dalam selang
Biar x dan y ialah dua nombor. Dalam kes ini, x dikatakan pembahagi y jika y mengembalikan baki sifar apabila dibahagikan dengan x. Pembahagi terbesar yang berlaku dalam selang adalah pembahagi bilangan terbesar unsur dalam selang.
Pernyataan Masalah
Diberi selang [a, b]. Cari pembahagi terbesar yang berlaku dalam julat yang mengandungi a dan b (selain daripada "1"). Mengembalikan 1 jika semua pembahagi berlaku bilangan kali yang sama.
Contoh 1
Input [2, 5]
Output 2
Penjelasan - Pembahagi 2 = {1, 2}, pembahagi 3 = {1, 3}, pembahagi 4 = {1, 2, 4}, pembahagi 5 = {1, 5} . 2 adalah pembahagi yang paling kerap.
Contoh 2
Input [2, 5]
Output 2
Penjelasan - Pembahagi 2 = {1, 2}, pembahagi 3 = {1, 3}, pembahagi 4 = {1, 2, 4}, pembahagi 5 = {1, 5} . 2 adalah pembahagi yang paling kerap.
Kaedah 1: Brute force cracking
Cara brute force untuk menyelesaikan masalah ini adalah dengan mencari semua pembahagi semua nombor dalam selang dan menyimpannya dalam peta bersama-sama dengan bilangan kejadian.
Algoritma
Pembahagi proses (bilangan)
Untuk i = 1 hingga n1/2+1
Jika num%i == 0
Jika nombor/i == i
Jika saya tiada dalam peta, masukkan (i, 1)
Jika tidak peta[i]++
Lain-lain
Jika saya tiada dalam peta, masukkan (i, 1)
Jika tidak peta[i]++
Jika nombor/i tiada dalam peta, masukkan (nombor/i, 1)
Peta lain[num/i]++
Proses maxDivisors (a, b)
untuk n = a hingga b
Pembahagi (n)
map.erase(1)
divisor = 1, count = int_min
Untuk setiap elemen dalam peta
jika ia.nilai > kira
kira = it.value
Pembahagi = it.key
Contoh: Pelaksanaan C++
Dalam atur cara di bawah, kita mencari pembahagi setiap nombor dalam fungsi pembahagi() dan mencari pembahagi berlaku terbesar dalam fungsi maxdivisor().
#include <bits/stdc++.h> using namespace std; // map storing occurrence of each divisor unordered_map<int, int> occ; // function to find all the divisors of a number and store it in map void divisors(int num){ for (int i = 1; i <= (sqrt(num) + 1); i++) { // checking if i is divisor of num if (num % i == 0) { // checking if num has identical divisors i.e. if i*i == num // if identical divisors then save only one if (num / i == i) { if (occ.find(i) == occ.end()) { occ.insert(make_pair(i, 1)); } else{ occ[i]++; } } else{ // saving divisor i if (occ.find(i) == occ.end()) { occ.insert(make_pair(i, 1)); } else{ occ[i]++; } // saving the divisor of num corresponding to i if (occ.find(num / i) == occ.end()) { occ.insert(make_pair(num / i, 1)); } else{ occ[num / i]++; } } } } } // function to find maximum occurring divisor in an interval int maxDivisor(int a, int b){ for (int n = a; n <= b; n++){ divisors(n); } // deleting all occurrences of 1 as 1 is not to be returned until the interval is [1,1] occ.erase(1); // divisor set as 1 for edge case scenario when interval is [1,1] int div = 1, cnt = INT_MIN; for (auto it = occ.begin(); it != occ.end(); it++) { if (it->second > cnt) { cnt = it->second; div = it->first; } } return div; } int main(){ int a = 4, b = 7; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Output
For the interval [4, 7] maximum occurring divisor = 2
Kerumitan masa - O(n3/2), kerana untuk setiap nombor dalam selang, untuk mencari pembahagi, gelung kerumitan O(n1/2) dilakukan.
Kerumitan ruang - O(n), ruang peta.
Kaedah 2
Kaedah di atas boleh dioptimumkan lagi dengan mengurangkan masa untuk mengisi peta dengan setiap kejadian pembahagi. Daripada mencari pembahagi setiap nombor, anda boleh mempelajari kejadian setiap pembahagi dalam selang dengan mengira sempadan bawah dan atas selang.
Mari kita ambil selang [2, 5] sebagai contoh.
Set pembahagi yang mungkin adalah dari 1 hingga 5. Oleh itu, 1 = 5/1 - 2/1 +1 = 4 berlaku. Nampaknya 2 = 5/2 - 2/2 + 1 = 2. Nampaknya 3 = 5/3 - 2/3 = 1. Nampaknya 4 = 5/4 - 2/4 = 1. Nampaknya 5 = 5/5 - 2/5 = 1.
Di atas boleh diformalkan sebagai,
Jika sempadan bawah% pembahagi == 0 maka occ = sempadan atas/pembahagi - sempadan bawah/pembahagi + 1
Occ lain = sempadan atas/pembahagi - sempadan bawah/pembahagi
Algoritma
Proses maxDivisor (a, b)
untuk i = 2 hingga b
Jika a%i == 0
Bilangan kali = b/i - a/i +1
Lain-lain
Bilangan kali = b/i - a/i
map.insert(i, times)
divisor = 1, count = int_min
Untuk setiap elemen dalam peta
jika ia.nilai > kira
kira = it.value
Pembahagi = it.key
Contoh: Pelaksanaan C++
Dalam atur cara di bawah, bukannya mencari pembahagi nombor dalam susunan terbalik, kami mencari untuk setiap pembahagi berapa banyak gandaan yang ada dalam selang itu.
#include <bits/stdc++.h> using namespace std; // function to find maximum occurring divisor in an interval int maxDivisor(int a, int b){ // map used to store occurrences of divisors unordered_map<int, int> occ; for (int i = 2; i <= b; i++){ int times; if (a % i == 0){ times = (b / i) - (a / i) + 1; } else{ times = (b / i) - (a / i); } occ.insert(make_pair(i, times)); } // divisor set as 1 for edge case scenario when interval is [1,1] int div = 1, cnt = INT_MIN; for (auto it = occ.begin(); it != occ.end(); it++){ if (it->second > cnt){ cnt = it->second; div = it->first; } } return div; } int main(){ int a = 1, b = 10; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Output
For the interval [1, 10] maximum occurring divisor = 2
Kaedah 3
Penyelesaian yang sangat mudah untuk masalah ini ditunjukkan di bawah,
Dalam sebarang selang saiz > 1, separuh nombor (setiap nombor genap) akan mempunyai 2 sebagai pembahaginya.
Jadi ia boleh digunakan seperti berikut.
Algoritma
Proses maxDivisors (a, b)
jika a == b
ans = a
Lain-lain
man = 2
Contoh: Pelaksanaan C++
Dalam program di bawah, kami melaksanakan pemerhatian bahawa setiap nombor genap mempunyai 2 sebagai pembahagi.
#include <bits/stdc++.h> using namespace std; // function to find the maximum occurring divisor in an interval int maxDivisor(int a, int b){ if (a == b){ return a; } else { return 2; } } int main(){ int a = 1, b = 10; cout << "For the interval [" << a << ", " << b << "] maximum occurring divisor = "; cout << maxDivisor(a, b); return 0; }
Output
For the interval [1, 10] maximum occurring divisor = 2
Kesimpulan
Ringkasnya, untuk mencari pembahagi kejadian terbesar dalam selang, kita boleh menggunakan kaedah di atas, julat masa adalah dari O(n3/2) hingga O(1), dan julat ruang adalah dari O(n) kepada O( 1).
Atas ialah kandungan terperinci pembahagi sepunya terbesar dalam selang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Walaupun definisi makro fungsi boleh memudahkan kod dan meningkatkan prestasi, ia juga mempunyai kelemahan: jenis tidak selamat, kesukaran penyahpepijatan, konflik penamaan dan redundansi kod. Selepas menimbang kebaikan dan keburukan, adalah penting untuk membuat keputusan termaklum apabila menggunakan makro fungsi.

Penjelasan terperinci tentang kaedah mencari pembahagi sepunya terbesar dalam bahasa C Pembahagi sepunya terbesar (GCD, Pembahagi Sepunya Terhebat) ialah konsep yang biasa digunakan dalam matematik, yang merujuk kepada pembahagi terbesar di antara beberapa integer. Dalam bahasa C, kita boleh menggunakan banyak kaedah untuk mencari pembahagi sepunya yang paling hebat. Artikel ini akan memperincikan beberapa kaedah biasa ini dan memberikan contoh kod khusus. Kaedah 1: Pembahagian Euclidean ialah kaedah klasik untuk mencari pembahagi sepunya terbesar bagi dua nombor. Idea asasnya ialah membahagikan pembahagi dan baki dua nombor secara berterusan

Mekanisme panggilan fungsi dalam C++ melibatkan menghantar argumen kepada fungsi dan melaksanakan kodnya, mengembalikan hasilnya jika wujud. Terdapat dua cara untuk lulus parameter: lulus mengikut nilai (pengubahsuaian dibuat di dalam fungsi) dan lulus melalui rujukan (pengubahsuaian ditunjukkan dalam pemanggil). Dalam penghantaran nilai, pengubahsuaian nilai dalam fungsi tidak menjejaskan nilai asal (seperti printValue), manakala pengubahsuaian dalam hantaran rujukan mempengaruhi nilai asal (seperti printReference).

Pembahagi sepunya terbesar boleh didapati dengan menggunakan algoritma Euclidean dalam bahasa C. Prinsipnya ialah: pembahagi sepunya terbesar bagi dua integer a dan b adalah sama dengan baki a dibahagikan dengan b dan pembahagi sepunya terbesar bagi c dan b. Algoritma ini sangat cekap dan boleh menyelesaikan dengan cepat walaupun berurusan dengan nombor yang besar.

Pengarang asal: 0xSea.eth Pada ketinggian blok 840,000, Bitcoin akan memulakan separuh keempatnya, dengan ganjaran blok dikurangkan daripada 6.25 BTC kepada 3.125 BTC Ini adalah peristiwa utama yang diberi perhatian oleh seluruh industri penyulitan. Dalam ekosistem Bitcoin, hampir semua orang memberi perhatian kepada protokol Runes, yang akan berada dalam talian dengan ketinggian blok 840,000. Bagaimanakah protokol Runes akan mengubah landskap ekosistem protokol lapisan Bitcoin? Apakah kesannya terhadap BRC-20, Atomics dan protokol lain? Sebagai pemerhati dan pemain, pada malam separuh masa dan pelancaran Runes, saya ingin menyelesaikan beberapa pemikiran saya baru-baru ini di pasaran. Protokol token satu lapisan Titik Pandangan Teras 1/Bitcoin akan membentuk BRC-20, Atomi

Tajuk: Gunakan pengaturcaraan bahasa C untuk melaksanakan penyelesaian pembahagi sepunya terhebat Pembahagi sepunya terbesar (pendek kata GCD) merujuk kepada integer positif terbesar yang boleh membahagi dua atau lebih integer pada masa yang sama. Penyelesaian untuk pembahagi sepunya yang paling hebat boleh sangat membantu untuk beberapa algoritma dan penyelesaian masalah. Dalam artikel ini, fungsi mencari pembahagi sepunya terbesar akan dilaksanakan melalui pengaturcaraan bahasa C, dan contoh kod khusus akan disediakan. Dalam bahasa C, anda boleh menggunakan Algoritma Euclidean untuk menyelesaikan maksimum

Dalam artikel ini, kami berhasrat untuk meneroka soalan yang menarik tentang pembahagi sepunya (GCD) tatasusunan terhebat dalam pelbagai bahasa pengaturcaraan, memfokuskan pada C++. Kami akan menunjukkan pendekatan algoritmik yang menggunakan pertukaran unsur berpasangan dan bilangan produk mereka untuk mengesahkan sama ada adalah mungkin untuk meningkatkan GCD melebihi 1. Selain itu, kami akan menyediakan cara lain untuk menyelesaikan masalah ini, masing-masing dengan definisi sintaksnya. Sebagai tambahan kepada penyelesaian ini, kami juga akan membentangkan dua kod boleh laku lengkap yang mengandungi kaedah ini. Sintaks Untuk memastikan pemahaman yang jelas tentang contoh kod yang berikut, kita mesti menilai dan memahami sintaks yang digunakan sebelum berbuat demikian. #include<iostream>#include<vecto

Bahasa C ialah bahasa pengaturcaraan komputer yang digunakan secara meluas dengan kelebihan platform silang, kecekapan tinggi dan fleksibiliti. Dalam bahasa C, kita sering menghadapi keperluan untuk mencari pembahagi sepunya terbesar, jadi sangat praktikal untuk mereka bentuk fungsi yang menggunakan bahasa C untuk mencari pembahagi sepunya terbesar. Artikel ini akan memperkenalkan secara terperinci cara menulis fungsi yang mencari pembahagi sepunya terbesar dalam bahasa C, dan memberikan contoh kod khusus. Pertama, kita perlu memahami maksud pembahagi sepunya terbesar. Pembahagi sepunya terbesar, juga dikenali sebagai faktor sepunya terbesar, merujuk kepada pembahagi terbesar sepunya kepada dua atau lebih integer.
