Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับตัวอักษรที่ค่า ASCII สามารถสร้างจากหลักของ N ได้ใน C++

กำหนดตัวแปร long ที่มีจำนวนบวกเป็นอินพุต เป้าหมายคือหาจำนวนตัวอักษรที่ค่า ASCII ของตัวเลขสามารถสร้างจากหลักของตัวเลขได้

เลือกสองหลักจากตัวเลขและจัดเรียงให้พวกเขาสร้างค่า ASCII ของตัวอักษรภาษาอังกฤษ ค่า ASCII ของ A-Z เริ่มจาก 65 ถึง 90 และค่า ASCII ของ a-z เริ่มจาก 97 ถึง 122

ตัวเลขทั้งหมดที่ต้องเลือกจะเป็น 26+26 = 52

ทำความเข้าใจด้วยตัวอย่าง

ตัวอย่าง

Input - N_digits = 163465

Output - จำนวนตัวอักษรที่ค่า ASCII สามารถสร้างจากหลักของ N คือ: 2

คำอธิบาย - ค่า ASCII ที่อยู่ใน 163465 คือ 65 และ 66 เท่านั้น ดังนั้นมีเพียงสองตัวอักษรที่เป็นไปได้

Input - N_digits = 902349

Output - จำนวนตัวอักษรที่ค่า ASCII สามารถสร้างจากหลักของ N คือ: 2

คำอธิบาย - ค่า ASCII ที่อยู่ใน 902349 คือ 90 และ 99 เท่านั้น ดังนั้นมีเพียงสองตัวอักษรที่เป็นไปได้

แนวทางที่ใช้ในโปรแกรมด้านล่าง

ในแนวทางนี้ เราจะสร้างอาร์เรย์ความถี่ total[10] ก่อนสำหรับเก็บความถี่ของหลักในตัวเลขอินพุต ตอนนี้รับแต่ละตัวเลข i ในช่วง 65 ถึง 90 และ 97 ถึง 122 แยกหลักของ i และค้นหาในอาร์เรย์ความถี่ ถ้าหลักทั้งหมดของ i อยู่ในอาร์เรย์ความถี่ (total[current digit] จะไม่เป็นศูนย์สำหรับทุกระดับ) ให้เพิ่ม count

  • รับ long int N_digits เป็นอินพุต
  • ฟังก์ชัน check(int arr[], int val) รับอาร์เรย์ความถี่ arr[] และตัวเลข ASCII val เป็นอินพุตและคืนค่า true ถ้า val สามารถสร้างจากหลักใน arr[] ได้
  • ใช้ for loop สร้างสำเนาของอาร์เรย์ความถี่เป็น total[10]
  • ตอนนี้ใช้ while loop แยกแต่ละหลักของ val และค้นหาใน total[]
  • ถ้า total[digit] เป็น 0 คืนค่า false มิฉะนั้นใช้มันและลดจำนวนลง 1
  • ลด val สำหรับ LSB ถัดไป
  • ถ้า while ทำงานจนจบ val สามารถสร้างจากหลักใน total[] ได้ คืนค่า true
  • ฟังก์ชัน ASCII_N(long long int N_digits) รับตัวเลขอินพุตและคืนค่าจำนวนตัวอักษรที่ค่า ASCII สามารถสร้างจากหลักของ N
  • ตั้งค่า count เริ่มต้นเป็น 0 และเริ่มต้นอาร์เรย์ความถี่ total[10] ด้วย 0
  • เติมอาร์เรย์ความถี่สำหรับหลักใน N_digits ด้วย while loop แยก LSB เป็น values = N_digits % 10 และเพิ่ม total[values] ขึ้น 1
  • ลด N_digits ลง 10
  • ตอนนี้วนลูปตัวเลข ASCII ของตัวอักษรจาก 97 ถึง 122 และ 65 ถึง 90 ด้วย for loop
  • ถ้า check(total, i) คืนค่า true เพิ่ม count
  • ในท้ายที่สุดของ for loops ทั้งสอง คืนค่า count เป็นผลลัพธ์

ตัวอย่าง

#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