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

Đếm các số trong phạm vi sao cho các chữ số trong đó và tích của nó với q là không bằng nhau trong C ++

Cho hai số bắt đầu và kết thúc dưới dạng biến phạm vi và một số nguyên q làm đầu vào. Mục đích là tìm các số trong một phạm vi sao cho số và tích của nó với q không có chữ số chung.

Nếu số là 5 và q là 3 thì tích sẽ là 15. Cả 5 và 15 đều có chữ số chung là 5.

Nếu số đó là 2 và q là 5 thì tích sẽ là 10. Cả 2 và 10 không có chữ số chung.

Hãy cho chúng tôi hiểu với các ví dụ.

Ví dụ

Đầu vào - start =5, end =10, q =2

Đầu ra - Đếm các số trong phạm vi sao cho các chữ số trong nó và tích của nó với q là không bằng nhau là:5

Giải thích - Các con số sẽ là:

  • 5 (5 * 2 =10)
  • 6 (6 * 2 =12)
  • 7 (7 * 2 =14)
  • 8 (8 * 2 =16)
  • 9 (9 * 2 =18)

Đầu vào - start =20, end =25, q =5

Đầu ra - Đếm các số trong phạm vi sao cho các chữ số trong nó và tích của nó với q là không bằng nhau là:2

Giải thích - Các con số sẽ là:

  • 22 (22 * 5 =110)
  • 23 (23 * 5 =115)

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

Trong cách tiếp cận này, chúng ta sẽ xem xét từ đầu đến cuối và chuyển đổi từng số và tích của nó với q thành chuỗi. Bây giờ, hãy tạo một mảng arr [26] sẽ lưu trữ số lượng ký tự của số hiện tại. Bây giờ hãy duyệt qua chuỗi sản phẩm (số hiện tại * q) và nếu bất kỳ ký tự nào của chuỗi đó có giá trị khác 0 trong arr [] thì nó là phổ biến nên trả về 0. Nếu không thì trả về 1.

  • Lấy các biến phạm vi và một giá trị q.
  • Kiểm tra hàm (int i, int q) nhận một số i và q và trả về 1 nếu các chữ số của i và q là không bằng nhau hoặc không phổ biến.
  • Chuyển đổi i thành chuỗi bằng cách sử dụng str =to_string (i).
  • Chuyển đổi sản phẩm (temp =q * i) thành sting bằng cách sử dụng str_2 =to_string (temp).
  • Lấy mảng tần số arr [26] ={0} cho số ký tự của str.
  • Duyệt str bằng vòng lặp for và cập nhật tần số bằng arr [str [j] - '0'] ++.
  • Đảo ngược str_2 bằng vòng lặp for và kiểm tra xem có bất kỳ arr [str_2 [j] - '0'] nào khác 0 không, nếu có thì là giá trị chung. Trả về 0.
  • Nếu không thì trả về 1.
  • Hàm không bằng nhau (int start, int end, int q) nhận các biến phạm vi và q và trả về số lượng các số trong phạm vi sao cho các chữ số trong đó và tích của nó với q là không bằng nhau.
  • Lấy số lượng ban đầu là 0.
  • Đảo các số bằng vòng lặp for từ i-start đến i =end.
  • Sử dụng kiểm tra (i, q) để tìm xem số i và tích của nó với q không có chữ số nào chung. Nếu có thì hãy đếm gia số.
  • Kết quả là số lượt trả lại cuối cùng.

Ví dụ

#include <bits/stdc++.h>
using namespace std;

int check(int i, int q) {
   string str = to_string(i);
   int length = str.size();
   int arr[26] = {
      0
   };

   int temp = i * q;
   string str_2 = to_string(temp);
   int length_2 = str_2.size();
   for (int j = 0; j < length; j++) {
      arr[str[j] - '0']++;
   }
   for (int j = 0; j < length_2; j++) {
      if (arr[str_2[j] - '0']) {
         return 0;
      }
   }
   return 1;
}

int unequal(int start, int end, int q) {
   int count = 0;

   for (int i = start; i <= end; i++) {
      if (check(i, q)) {
         count++;
      }
   }
   return count;
}
int main() {
   int start = 20, end = 40, q = 4;
   cout << "Count of numbers in range such that digits in it and it's product with q are unequal are: " << unequal(start, end, q);
   return 0;
}

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

Đầu ra

Count of numbers in range such that digits in it and it's product with q are unequal are: 1