Cho một biến dài có chứa một số dương làm đầu vào. Mục đích là tìm số bảng chữ cái có các chữ số giá trị ASCII có trong các chữ số của số.
Chọn hai chữ số bất kỳ từ số và sắp xếp chúng theo cách sao cho chúng tạo thành giá trị ASCII của bảng chữ cái tiếng Anh. Giá trị ASCII của A-Z bắt đầu từ 65 đến 90 và giá trị ASCII của a-z bắt đầu từ 97 đến 122.
Tổng các số sẽ được chọn sẽ là 26 + 26 =52.
Hãy cho chúng tôi hiểu với các ví dụ.
Ví dụ
Đầu vào - N_digits =163465
Đầu ra - Số bảng chữ cái có giá trị ASCII có thể được tạo thành với các chữ số của N là:2
Giải thích - Các giá trị ASCII có trong năm 163465 chỉ là 65 và 66. Vì vậy, chỉ có thể có hai bảng chữ cái.
Đầu vào - N_digits =902349
Đầu ra - Số bảng chữ cái có giá trị ASCII có thể được tạo thành với các chữ số của N là:2
Giải thích - Các giá trị ASCII có trong 902349 chỉ là 90 và 99. Vì vậy, chỉ có thể có hai bảng chữ cái.
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, trước tiên chúng ta sẽ tạo một mảng tần số tổng [10] để lưu trữ tần số của các chữ số trong số đầu vào. Bây giờ lấy từng số i trong các phạm vi 65 đến 90 và 97 đến 122. Trích xuất các chữ số của i và tìm kiếm trong mảng tần số. Nếu tất cả các chữ số của i đều có mặt trong mảng tần số (tổng [chữ số hiện tại] sẽ khác 0 cho tất cả các chữ số) thì số tăng dần.
- Lấy dài int N_digits làm đầu vào.
- Kiểm tra hàm (int arr [], int val) nhận mảng tần số arr [] và số ASCII val làm đầu vào và trả về true nếu val có thể được tạo từ các chữ số trong arr [].
- Sử dụng vòng lặp for tạo một bản sao của mảng tần số dưới dạng tổng số [10].
- Bây giờ sử dụng vòng lặp while, trích xuất từng chữ số của val và tìm kiếm trong tổng số [].
- Nếu tổng [chữ số] là 0 thì trả về false, nếu không, hãy sử dụng nó và giảm số lượng của nó đi 1.
- Giảm giá trị cho LSB tiếp theo.
- Nếu trong khi thực thi đầy đủ thì val có thể được tạo từ các chữ số trong tổng số [] nên trả về true.
- Hàm ASCII_N (long long int N_digits) nhận số đầu vào và trả về số bảng chữ cái có giá trị ASCII có thể được tạo bằng các chữ số của N.
- Lấy số lượng ban đầu là 0 và khởi tạo tổng số mảng tần số [10] bằng 0.
- Điền mảng tần số cho các chữ số trong N_digits bằng vòng lặp while. Trích xuất LSB dưới dạng giá trị =N_digits% 10 và tăng tổng [giá trị] lên 1.
- Giảm N_digits xuống 10.
- Giờ đây, duyệt các số ASCII của bảng chữ cái từ 97 đến 122 và 65 đến 90 bằng vòng lặp for.
- Nếu bất kỳ kiểm tra nào (tổng số, i) trả về true thì số lượng tăng dần.
- Ở cuối cả hai vòng lặp for, kết quả là kết quả trả về.
Ví dụ
#include<bits/stdc++.h> using namespace std; bool check(int arr[], int val) { int total[10]; for (int i = 0; i < 10; i++) { total[i] = arr[i]; } while (val > 0) { int values = val % 10; if (total[values] == 0) { return false; } else { total[values]--; } val = floor(val / 10); } return true; } int ASCII_N(long long int N_digits) { int count = 0; int total[10] = { 0 }; while (N_digits > 0) { int values = N_digits % 10; total[values]++; N_digits = floor(N_digits / 10); } for (int i = 97; i <= 122; i++) { if (check(total, i)) { count++; } } for (int i = 65; i < 91; i++) { if (check(total, i)) { count++; } } return count; } int main() { long long int N_digits = 251326; cout << "Count of alphabets whose ASCII values can be formed with the digits of N are: " << ASCII_N(N_digits); }
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 alphabets whose ASCII values can be formed with the digits of N are: 2