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

Đếm số trong một phạm vi chia hết cho m và có chữ số d ở vị trí chẵn trong C ++

Chúng ta được cung cấp với một phạm vi số nguyên, một biến m được sử dụng làm số chia và một biến d được sử dụng để kiểm tra xem chữ số 'd' có ở vị trí chẵn hay không và nhiệm vụ là tính số lượng các số đó trong một phạm vi chia hết cho biến m và có chữ số d ở vị trí chẵn.

Ví dụ

Đầu vào - int start =20, end =50, d =8 và m =4

Đầu ra - Số lượng các số trong một dãy chia hết cho m và có chữ số d ở vị trí chẵn là:2

Giải thích - Phạm vi bắt đầu từ 20 đến 50. Vì vậy, các số có thể có chữ số d, tức là 8 là 28, 38 và 48 có 8 ở các vị trí chẵn tức là 2 và các số 24 và 48 chia hết cho m tức là 4 do đó số đếm là 2.

Đầu vào - int start =10, end =100, d =6 và m =2

Đầu ra - Số lượng các số trong một dãy chia hết cho m và có chữ số d ở vị trí chẵn là:8

Giải thích - Phạm vi bắt đầu từ 10 đến 100. Vì vậy, các số có thể có chữ số d, tức là 6, 16, 26, 36, 46, 56, 66, 76, 86 và 96 có 6 ở vị trí chẵn ngoại trừ số 6 và 66 ở vị trí lẻ nên chúng tôi sẽ không bao gồm điều này và bây giờ chúng tôi sẽ kiểm tra các số trong danh sách có chia hết cho 2 không để tất cả các số tức là 16, 26, 36, 46, 56, 76, 86 và 96 chia hết cho 2 do đó tính là 8.

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

  • Tạo một dải số nguyên bắt đầu từ đầu biến cho đến cuối biến và khai báo biến d và m và nhập các giá trị. Chuyển dữ liệu đến hàm để xử lý thêm.
  • Tạo một biến kiểu vectơ, giả sử vec.
  • Vòng lặp bắt đầu trong khi cho đến khi giá trị là giá trị bên trong biến bắt đầu. Bây giờ, trong khi đẩy giá trị là val% 10 vào vector và đặt val là val / 10.
  • Gọi hàm ngược trong STL bằng cách chuyển vec.begin () và vec.end () làm đối số cho nó.
  • Đặt các giá trị trong mảng là -1 bằng cách sử dụng memset.
  • Trả về set_total (0, 0, 0, vec) là một hàm sẽ kiểm tra xem các số có vị trí chẵn d và có chia hết cho m không
  • Bên trong set_total Chức năng-:
    • Kiểm tra IF vị trí bằng với kích thước của vectơ, sau đó kiểm tra IF temp =0 rồi trả về 1 hoặc trả về 0.
    • Kiểm tra IF arr [place] [temp] [val] không bằng -1 rồi trả về giá trị tại arr [place] [temp] [val].
    • Kiểm tra IF place% 2 =1, sau đó kiểm tra IF val =0, sau đó kiểm tra IF d lớn hơn vec [place] rồi trả về 0
    • Khai báo biến temp_2 và đặt nó thành 0.
    • Kiểm tra IF d nhỏ hơn vec [place], sau đó đặt temp_2 thành 1.
    • Khai báo biến temp_3 và thực hiện cuộc gọi đệ quy tới set_total () và trả về arr [place] [temp] [val] =temp_3
    • Khai báo một số lượng biến để lưu trữ kết quả.
    • Khai báo một biến set_limit và đặt nó thành 9 IF val bằng 1 ELSE đặt nó bằng vec [place].
    • Bắt đầu vòng lặp FOR từ i đến 0 cho đến set_limit và kiểm tra NẾU i bằng d rồi tiếp tục
    • Khai báo một biến là temp_2 và đặt nó thành val
    • Kiểm tra NẾU tôi nhỏ hơn vec [place] rồi đặt temp_2 là 1
    • Đặt số lượng bằng lệnh gọi đệ quy tới hàm set_total
    • Trả lại arr [place] [temp] [val] =count.

Ví dụ

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

int arr[20][20][2];
int d, m;

int set_total(int place, int temp, int val, vector < int > vec) {
   if (place == vec.size()) {
      if (temp == 0) {
         return 1;
      }
      return 0;
   }
   if (arr[place][temp][val] != -1) {
      return arr[place][temp][val];
   }
   if (place % 2) {
      if (val == 0) {
         if (d > vec[place]) {
            return 0;
         }
      }
      int temp_2 = val;
      if (d < vec[place]) {
         temp_2 = 1;
      }
      int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec);
      return arr[place][temp][val] = temp_3;
   }
   int count = 0;
   int set_limit = (val ? 9 : vec[place]);
   for (int i = 0; i <= set_limit; i++) {
      if (i == d) {
         continue;
      }
      int temp_2 = val;
      if (i < vec[place]) {
         temp_2 = 1;
      }
      count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec);
   }
   return arr[place][temp][val] = count;
}

int divisible(int val) {
   vector < int > vec;
   while (val) {
      vec.push_back(val % 10);
      val = val / 10;
   }
   reverse(vec.begin(), vec.end());
   memset(arr, -1, sizeof(arr));
   return set_total(0, 0, 0, vec);
}
int main() {
   int start = 20, end = 50;
   d = 8, m = 4;
   int count = divisible(end) - divisible(start);
   cout << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count;
   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 a Range divisible by m and having digit d in even positions are: 2