Jadual Kandungan
Pernyataan Masalah
Contoh 2
Kaedah 1: Brute force cracking
Algoritma
Contoh: Pelaksanaan C++
Output
Kaedah 3
Kesimpulan
Rumah pembangunan bahagian belakang C++ pembahagi sepunya terbesar dalam selang

pembahagi sepunya terbesar dalam selang

Sep 01, 2023 am 10:09 AM
pembahagi sepunya terbesar selang waktu

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]
Salin selepas log masuk
Salin selepas log masuk
Output 2
Salin selepas log masuk
Salin selepas log masuk

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]
Salin selepas log masuk
Salin selepas log masuk
Output 2
Salin selepas log masuk
Salin selepas log masuk

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;
}
Salin selepas log masuk

Output

For the interval [4, 7] maximum occurring divisor = 2
Salin selepas log masuk

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;
}
Salin selepas log masuk

Output

For the interval [1, 10] maximum occurring divisor = 2
Salin selepas log masuk
Salin selepas log masuk

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;
}
Salin selepas log masuk

Output

For the interval [1, 10] maximum occurring divisor = 2
Salin selepas log masuk
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kelebihan dan kekurangan definisi makro fungsi C++? Apakah kelebihan dan kekurangan definisi makro fungsi C++? Apr 11, 2024 pm 04:54 PM

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 cara menggunakan bahasa C untuk mencari pembahagi sepunya terbesar Penjelasan terperinci tentang cara menggunakan bahasa C untuk mencari pembahagi sepunya terbesar Feb 18, 2024 pm 11:10 PM

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

Penjelasan terperinci tentang mekanisme panggilan fungsi C++ Penjelasan terperinci tentang mekanisme panggilan fungsi C++ Apr 11, 2024 pm 02:12 PM

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).

Bagaimana untuk mencari pembahagi sepunya terbesar dalam bahasa C Bagaimana untuk mencari pembahagi sepunya terbesar dalam bahasa C Sep 27, 2023 am 09:41 AM

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.

Mengambil kira tiga negara yang membunuh protokol lapisan 1 Bitcoin: BRC-20, Atomics, Runes Mengambil kira tiga negara yang membunuh protokol lapisan 1 Bitcoin: BRC-20, Atomics, Runes Apr 23, 2024 pm 02:01 PM

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

Menggunakan pengaturcaraan bahasa C untuk menyelesaikan pembahagi sepunya terbesar Menggunakan pengaturcaraan bahasa C untuk menyelesaikan pembahagi sepunya terbesar Feb 21, 2024 pm 07:30 PM

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

Semak sama ada pembahagi sepunya terbesar dalam tatasusunan boleh dibuat lebih besar daripada 1 dengan menggantikan pasangan dengan produk mereka Semak sama ada pembahagi sepunya terbesar dalam tatasusunan boleh dibuat lebih besar daripada 1 dengan menggantikan pasangan dengan produk mereka Aug 31, 2023 pm 06:49 PM

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

Reka fungsi yang ditulis dalam bahasa C untuk mencari pembahagi sepunya terbesar Reka fungsi yang ditulis dalam bahasa C untuk mencari pembahagi sepunya terbesar Feb 19, 2024 pm 10:27 PM

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.

See all articles