Computer >> Máy Tính >  >> Lập trình >> C ++

Số Equidigital trong C ++

Số kỹ thuật số là các số đặc biệt về mặt toán học, trong đó số chữ số trong số đó bằng số trong phép thừa số nguyên tố của nó.

Trong bài toán này, chúng ta được cung cấp một giá trị nguyên n. Nhiệm vụ của chúng tôi là tạo một chương trình cho tất cả các số bằng nhau đến n.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào: n =12

Đầu ra:1 2 3 5 7 10 11

Phương pháp tiếp cận giải pháp:

Một giải pháp đơn giản cho vấn đề là tìm các thừa số của số và kiểm tra xem số số nguyên tố có bằng số chữ số trong số đó hay không.

Các yếu tố chính có thể được tìm thấy bằng cách sử dụng phương pháp sàng.

Thuật toán:

Bước 1: tìm tất cả các số nguyên tố.
Bước 2: đếm các chữ số trong số n.

Bước 3: Tìm tất cả các thừa số nguyên tố của một số và đếm số chữ số trong đó.

Bước 4: So sánh cả hai giá trị.
Bước 5: Trả lại số nếu đúng.

Chương trình minh họa hoạt động của giải pháp của chúng tôi,

Ví dụ

#include<bits/stdc++.h>
using namespace std;
const int MAX = 10000;

vector <int> primes;

void findAllPrimes()
{
   bool marked[MAX/2 + 1] = {0};
   for (int i=1; i*i<= (MAX -1)/2; i++)
      for (int j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
         marked[j] = true;
   primes.push_back(2);
   for (int i=1; i<=MAX/2; i++)
      if (marked[i] == false)
         primes.push_back(2*i + 1);
}

bool isEquidigital(int n) {
   
   if (n == 1)
      return true;
   int number = n;
   int digitSum = 0;
   while (number > 0)
   {
      digitSum++;
      number = number/10;
   }
   int primeDigits = 0 , expCount = 0, p;
   for (int i = 0; primes[i] <= n/2; i++) {
      while (n % primes[i] == 0) {
         p = primes[i];
         n = n/p;
         expCount++;
      }
      while (p > 0) {
         primeDigits++;
         p = p / 10;
      }
      while (expCount > 1) {
         primeDigits++;
         expCount = expCount / 10;
      }
   }
   if (n != 1)
   {
      while (n > 0)
      {
         primeDigits++;
         n = n/10;
      }
   }

   return (primeDigits == digitSum);
}

int main() {

   findAllPrimes();
   int n = 11;
   cout << "Printing Equidigital Numbers less than "<<n<<" : ";
   for (int i=1; i<n; i++)
      if (isEquidigital(i))
         cout<<i<<"\t";
   return 0;
}

Đầu ra -

Printing Equidigital Numbers less than 11 : 1 2 3 5 7 10 11