给定一个包含正数作为输入的长变量。目的是找到字母的计数,这些字母的ASCII值数字出现在数字的数字中。
从数字中选择任意两个数字,并以使其形成英语字母的ASCII值的方式进行排列。AZ的ASCII值从65到90开始,az的ASCII值从97到122开始。
将被挑选的总数将是26 + 26 = 52。
例如
输入 -N_digits = 163465
输出 -ASCII值可以用N的数字形成的字母计数为:2
说明-163465中显示的ASCII值仅为65和66。因此,只有两个字母是可能的。
输入-N_digits = 902349
输出 -ASCII值可以用N的数字形成的字母计数为:2
说明-902349中存在的ASCII值仅为90和99。因此,只有两个字母是可能的。
在这种方法中,我们将首先创建一个频率数组total [10],用于存储输入数字中的数字频率。现在,将i取在65到90以及97到122的范围内。提取i的数字并在频率数组中搜索。如果频率数组中存在i的所有数字(所有数字的total [当前数字]都不为零),则递增计数。
以long int N_digits作为输入。
函数check(int arr [],int val)将频率数组arr []和ASCII数字val作为输入,如果val可以由arr []中的数字组成,则返回true。
使用for循环将频率数组的副本复制为total [10]。
现在使用while循环,提取val的每个数字并搜索total []。
如果total [digit]为0,则返回false,否则使用false并将其计数减1。
降低下一个LSB的val。
如果while完全执行,则val可以由total []中的数字组成,因此返回true。
函数ASCII_N(long long int N_digits)接受输入的数字并返回字母的计数,其ASCII值可以用N的数字形成。
将初始计数设为0,然后将频率数组total [10]初始化为0。
使用while循环为N_digits中的数字填充频率数组。将LSB提取为值= N个数字%10,并将total [values]递增1。
将N_digits减少10。
现在,使用for循环遍历从97到122和65到90的ASCII字母数字。
如果check(total, i)返回真,则增加计数。
在两个for循环的末尾,返回计数作为结果。
#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 << "ASCII值可以由N的数字组成的字母计数为: " << ASCII_N(N_digits); }
如果我们运行上面的代码,它将生成以下输出-
输出结果
ASCII值可以由N的数字组成的字母计数为: 2