Rumah >pembangunan bahagian belakang >C++ >Nombor terbesar tidak melebihi N dan tidak mengandungi sebarang nombor dalam S

Nombor terbesar tidak melebihi N dan tidak mengandungi sebarang nombor dalam S

WBOY
WBOYke hadapan
2023-09-05 17:17:031312semak imbas

Nombor terbesar tidak melebihi N dan tidak mengandungi sebarang nombor dalam S

Cabaran untuk mencari nombor terbesar tidak melebihi nombor N yang diberikan dan tidak mengandungi mana-mana digit dalam rentetan S adalah masalah yang melibatkan manipulasi rentetan dan teori nombor Matlamatnya adalah untuk menentukan nombor terbesar yang mungkin kurang daripada atau sama dengan N sementara juga tidak termasuk semua digit yang terdapat dalam rentetan S.

Sebagai contoh, pertimbangkan senario di mana N bersamaan dengan 1000 dan S bersamaan dengan "42". Dalam kes ini, nombor terbesar yang tidak melebihi N dan tidak mengandungi sebarang digit dalam S ialah 999. Ini kerana 999 ialah nombor terbesar yang mungkin dibentuk menggunakan digit 0, 1, 3, 5, 6, 7, 8, dan 9, tidak termasuk digit 4 dan 2 dalam rentetan S.

Pendekatan yang berbeza boleh digunakan untuk menyelesaikan masalah ini, seperti mengulangi semua nombor sehingga N dan mengesahkan sama ada digit mereka tidak terdapat dalam S, atau dengan menggunakan kaedah yang lebih kompleks seperti pengaturcaraan dinamik atau penjejakan ke belakang.

Algoritma

Langkah 1 − Kami akan mengisytiharkan dua pembolehubah rentetan bernama 'N' dan 'S' dalam fungsi utama().

Langkah 2 - Kami akan menghantar dua pembolehubah ini sebagai parameter kepada fungsi LargestNumberFinder().

Langkah 3 − Kami akan menukar rentetan nombor N dan S kepada integer secara tersirat untuk melakukan operasi matematik seperti perbandingan.

Langkah 4 - Kami akan mengeluarkan 0 di hadapan daripada nombor yang disimpan dalam N sama ada secara manual atau dengan mencipta fungsi yang akan melakukan perkara yang sama setiap kali.

Langkah 5 − Kemudian, kita akan mula membandingkan digit kedua-dua rentetan dan mengetahui nombor terbesar yang terbentuk tidak lebih daripada 'N' yang tidak mengandungi sebarang digit daripada rentetan 'S'.

Pendekatan 1: - Pendekatan Naif

Cara asas untuk mencari nombor terbesar dalam rentetan tertentu menggunakan semua nombor dalam rentetan lain adalah seperti berikut. Fungsi utama mengisytiharkan pembolehubah dan memanggil fungsi LargestNumberFinder. Fungsi ini mengambil dua rentetan sebagai input dan menyemak setiap nilai kurang daripada N yang mempunyai semua digit dalam rentetan S. Jika syarat dipenuhi, nilai dikembalikan dalam format rentetan. Fungsi kehadiran digunakan untuk menentukan sama ada nilai yang disimpan dalam 'i' adalah sebahagian daripada rentetan S semasa menukar S kepada jenis data integer. Rentetan input ditukar kepada integer dan gelung digunakan untuk menilai keadaan. Kod ini mengeluarkan nilai maksimum semua nombor dalam rentetan tertentu yang juga terdapat dalam rentetan lain.

Contoh

diterjemahkan sebagai:

Contoh

Kod ini ialah penyelesaian yang mencari nombor terbesar yang lebih kecil daripada N (rentetan input ditukar kepada integer) yang terdiri daripada digit dalam rentetan S. Kod ini menggunakan dua fungsi, 'kehadiran' dan 'PencariNumber Besar' untuk menentukan dan mengembalikan nombor terbesar. Fungsi kehadiran mengambil sebagai input integer 'i' dan rentetan 's', menyemak sama ada nilai yang disimpan dalam 'i' adalah sebahagian daripada rentetan 's' dan menukar 's' kepada jenis data integer. Fungsi LargestNumberFinder mengambil dua rentetan 'x' dan 's' sebagai input, menukar 'x' kepada integer, dan kemudian menggunakan fungsi kehadiran untuk menyemak semua nilai kurang daripada N dan semua nombor berada dalam 's'. Fungsi utama mengisytiharkan pembolehubah dan memanggil fungsi LargestNumberFinder, yang mengembalikan nombor terbesar sebagai rentetan.

#include <iostream>
#include <string>
#include <vector>

// function to check whether value stored in ‘i’ is part of string S while also converting S into integer data type.
bool attendance(int i, std::string s) {
   while (i) {
      int first_digit = i % 10;
      i /= 10;
      int t = std::stoi(s);
      bool found = false;
      while (t) {
         int second_digit = t % 10;
         t /= 10;
         if (second_digit == first_digit) {
            found = true;
            break;
         }
      }
      if (!found)
         return false;
   }
   return true;
}

// function to input two strings and check for each value less than N with all digits present in S.
std::string LargestNumberFinder(std::string x, std::string s) {
   int N = std::stoi(x);
   for (int i = N; i >= 1; i--) {
      if (attendance(i, s)) {
         return std::to_string(i);
      }
   }
   return "-1";
}

// main function to declare the variables and call the function.
int main() {
   std::string N = "100709";
   std::string S = "70";
   std::cout << LargestNumberFinder(N, S);
}

Output

77777

Kaedah 2: Kaedah yang cekap

Penyelesaian kepada masalah 2, iaitu mendapatkan nombor terbesar yang mungkin dengan menggantikan digit rentetan angka N yang diberikan dengan digit rentetan S yang diberikan, adalah pendekatan yang cekap. Kaedah ini terlebih dahulu menyemak sama ada setiap nombor N hadir dalam S dan menggantikan nombor pertama yang terdapat dalam S dengan nombor terbesar dalam S yang tiada dalam N. Nombor yang selebihnya kemudiannya digantikan dengan nombor terbesar dalam S yang bukan dalam N. Sifar pendahuluan kemudian dialih keluar dan hasilnya dikembalikan sebagai nombor terbesar yang mungkin. Kaedah ini lebih cekap daripada kaedah sebelumnya kerana ia tidak memerlukan rentetan untuk diisih.

Contoh

diterjemahkan sebagai:

Contoh

Kod menyelesaikan masalah mencari nombor yang boleh dibentuk daripada rentetan "N" yang diberikan dengan menggantikan digit terbesar dengan digit tertinggi yang tidak terdapat dalam rentetan "S". Kod ini menggunakan kaedah yang cekap untuk menyelesaikan masalah. Fungsi LargestNumberFinder mengambil dua input rentetan, "num" dan "s", dan mengembalikan bilangan terbesar yang mungkin. Vektor "vis_s" digunakan untuk menyimpan nilai rentetan "s". rentetan " num" yang merupakan sebahagian daripada rentetan "s". Kemudian ia menukar digit itu dengan angka tertinggi yang tidak terdapat dalam rentetan "s". digit dalam rentetan "num" dengan digit itu Sifar di hadapan dikeluarkan daripada rentetan akhir, dan jika rentetan itu kosong, fungsi mengembalikan "0". S" .

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// function to check for all values of String N with String S and replacing the digit if found same with the largest possible digit not present in S.
string LargestNumberFinder(string num, string s) {
   vector<bool> vis_s(10, false);
   for (int i = 0; i < (int)s.size(); i++) {
      vis_s[int(s[i]) - 48] = true;
   }
   int n = num.size();
   int in = -1;
   for (int i = 0; i < n; i++) {
      if (vis_s[(int)num[i] - '0']) {
         in = i;
         break;
      }
   }
   if (in == -1) {
      return num;
   }
   for (char dig = num[in]; dig >= '0'; dig--) {
      if (vis_s[(int)dig - '0'] == 0) {
         num[in] = dig;
         break;
      }
   }
   char LargestDig = '0';
   for (char dig = '9'; dig >= '0'; dig--) {
      if (vis_s[dig - '0'] == false) {
         LargestDig = dig;
         break;
      }
   }
   for (int i = in + 1; i < n; i++) {
      num[i] = LargestDig;
   }
   int Count = 0;
   for (int i = 0; i < n; i++) {
      if (num[i] == '0')
         Count++;
      else
         break;
   }
   num.erase(0, Count);
   if ((int)num.size() == 0)
      return "0";
   return num;
}
int main() {
   string N = "161516";
   string S = "756";
   cout << LargestNumberFinder(N, S);
   return 0;
}

Output

149999

结论

通过这篇文章,我们更接近理解这些问题背后的原因,并理解了这些概念,这些概念将帮助我们在之前提到的重大实际问题中使用这些基本概念。就像在我们的代码中,我们分别解决每个问题,然后像制作美丽的手工品一样将代码缝合在一起,同样,我们将使用这个概念,尝试逐个解决问题。我们通常会从朴素的方法开始,但通过敏锐的眼光和努力,我们会找到更高效的方法。谁知道在阅读完这篇文章后,你会找到更好、更高效的方法,并进一步简化解决方案。所以,让我们坚持我们的信念和对思维和编码的信任,同时告别。

Atas ialah kandungan terperinci Nombor terbesar tidak melebihi N dan tidak mengandungi sebarang nombor dalam S. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam