1021 个位数统计

1021 个位数统计

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

先放上我自己写的代码。 处理上有一点小问题。首先,我需要使用字符串来存储每种不同的个位数字,然后对字符串进行排序,而不是直接对字符进行排序。还有就是字符与数字,数字与字符之间的转换。

#include 
#include 
using namespace std;

bool cmp(char a, char b) {return a < b;}
int main() {
	string s;
	cin >> s;
	int map[1000]={0};
	int size=s.size();
	for(int i=0;i

修改后的代码:

#include 
#include 
using namespace std;

bool cmp(char a, char b) {
    return a < b;
}

int main() {
    string s;
    cin >> s;
    int map[10] = {0}; // 使用长度为10的数组,每个索引对应一个数字的出现次数
    int size = s.size();

    for (int i = 0; i < size; i++) {
        char digit = s[i];
        if (isdigit(digit)) {
            int num = digit - '0'; // 将字符转换为数字
            map[num] += 1;  //如果直接map[digit]会报错 
        }
    }

    string unique_digits; // 存储不同的个位数字
    for (int i = 0; i < 10; i++) {
        if (map[i] > 0) {
            unique_digits += to_string(i); // 将数字转换为字符串并存储
        }
    }

    sort(unique_digits.begin(), unique_digits.end(), cmp); // 对不同的数字字符串排序

    for (int j = 0; j < unique_digits.size(); j++) {
        int digit = unique_digits[j] - '0'; // 将字符还原为数字
        cout << digit << ":" << map[digit] << endl;
    }

    return 0;
}

1021 个位数统计_第1张图片

其中的几个点:

1. isdigit 是C++中的一个函数,用于检查一个字符是否是数字字符(0-9)。如果字符是数字字符,isdigit 函数返回非零值,否则返回0

2. 

unique_digits += to_string(i); 这句代码的作用是将不同的个位数字(i)转换为字符串,并将它们追加到名为 unique_digits 的字符串中。

进一步解释:

  1. to_string(i):这部分将整数 i 转换为对应的字符串。例如,如果 i 的值为 5,to_string(i) 将返回字符串 "5"。

  2. unique_digits += to_string(i);:这部分代码使用 += 运算符,将转换后的字符串追加到 unique_digits 字符串的末尾。每次循环,它将不同的个位数字(以字符串形式)添加到 unique_digits 中。

举例来说,如果输入字符串中有数字 3 和 5,那么 unique_digits 变量将包含字符串 "35"。这是为了将不同的个位数字都保存在一个字符串中,以便后续对它们进行排序和输出。

3.

 可以变成下面这种

1021 个位数统计_第2张图片

但仍然需要把字符转化成数字,不然会报错。

1021 个位数统计_第3张图片

你可能感兴趣的:(算法)