กำหนดตัวแปรแบบยาวที่มีจำนวนบวกเป็นอินพุต เป้าหมายคือการหาจำนวนตัวอักษรที่มีตัวเลขค่า ASCII อยู่ในตัวเลขของตัวเลข
เลือกตัวเลขสองหลักจากตัวเลขและจัดเรียงในลักษณะที่ทำให้เป็นค่า ASCII ของตัวอักษรภาษาอังกฤษ ค่า ASCII ของ A-Z เริ่มต้นที่ 65 ถึง 90 และค่า ASCII ของ a-z เริ่มต้นจาก 97 ถึง 122
จำนวนทั้งหมดที่จะเลือกจะเป็น 26+26=52
ให้เราเข้าใจด้วยตัวอย่าง
ตัวอย่าง
ป้อนข้อมูล - N_digits =163465
ผลลัพธ์ - จำนวนตัวอักษรที่ค่า ASCII ขึ้นได้ด้วยตัวเลข N คือ 2
คำอธิบาย - ค่า ASCII ที่มีอยู่ใน 163465 คือ 65 และ 66 เท่านั้น ดังนั้นจึงมีตัวอักษรเพียงสองตัวเท่านั้น
ป้อนข้อมูล - N_digits =902349
ผลลัพธ์ - จำนวนตัวอักษรที่ค่า ASCII ขึ้นได้ด้วยตัวเลข N คือ 2
คำอธิบาย - ค่า ASCII ที่มีอยู่ใน 902349 คือ 90 และ 99 เท่านั้น ดังนั้นจึงมีตัวอักษรเพียงสองตัวเท่านั้น
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางนี้ ก่อนอื่นเราจะสร้างอาร์เรย์ความถี่ total[10] เพื่อจัดเก็บความถี่ของตัวเลขในตัวเลขอินพุต ตอนนี้ใช้แต่ละหมายเลข i ในช่วง 65 ถึง 90 และ 97 ถึง 122 แยกหลักของ i และค้นหาในอาร์เรย์ความถี่ หากตัวเลขทั้งหมดของ i มีอยู่ในอาร์เรย์ความถี่ (ผลรวม [ ตัวเลขปัจจุบัน] จะไม่เป็นศูนย์สำหรับตัวเลขทั้งหมด ) ให้นับการเพิ่มขึ้น
- ป้อนข้อมูลแบบยาว N_digits เป็นอินพุต
- การตรวจสอบฟังก์ชัน(int arr[], int val) ใช้อาร์เรย์ความถี่ arr[] และ val หมายเลข ASCII เป็นอินพุตและคืนค่าเป็น true หาก val สามารถสร้างจากตัวเลขใน arr[]
- การใช้ลูปทำสำเนาอาร์เรย์ความถี่เป็นจำนวนรวม[10]
- ตอนนี้ใช้ while loop แยกแต่ละหลักของ val แล้วค้นหาทั้งหมด[]
- หากผลรวม[หลัก] เป็น 0 ให้คืนค่าเท็จ มิฉะนั้น ใช้และลดจำนวนลง 1
- ลด val สำหรับ LSB ถัดไป
- หากในขณะที่ดำเนินการอย่างเต็มที่ val สามารถสร้างได้จากตัวเลขทั้งหมด[] ดังนั้นให้คืนค่าเป็น true
- ฟังก์ชัน ASCII_N(long long int N_digits) นำตัวเลขที่ป้อนเข้ามาและส่งคืนจำนวนตัวอักษรที่มีค่า ASCII สามารถสร้างได้ด้วยตัวเลขของ N
- นับเริ่มต้นเป็น 0 และเริ่มต้นอาร์เรย์ความถี่ทั้งหมด [10] ด้วย 0
- เติมอาร์เรย์ความถี่สำหรับตัวเลขใน N_digits โดยใช้ while loop แยก LSB เป็นค่า =N_digits % 10 และเพิ่มผลรวม [values] ทีละ 1
- ลด N_digits ลง 10
- ตอนนี้สำรวจตัวเลข ASCII ของตัวอักษรตั้งแต่ 97 ถึง 122 และ 65 ถึง 90 โดยใช้การวนซ้ำ
- หากมีการตรวจสอบใดๆ (ผลรวม i) คืนค่า จริง ให้นับการเพิ่มขึ้น
- ที่ส่วนท้ายของทั้งสอง for loops จะนับเป็นผลลัพธ์
ตัวอย่าง
#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);
} หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
ผลลัพธ์
Count of alphabets whose ASCII values can be formed with the digits of N are: 2