1021 个位数统计
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+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 <iostream>
#include <algorithm>
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<size;i++){
map[s[i]]+=1;
}
for(int j=0;j<size;j++){
sort(s[j].begin(),s[j].end(),cmp);
cout<<s[j]<<":"<<map[s[j]]<<endl;
}
return 0;
}
修改后的代码:
#include <iostream>
#include <algorithm>
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;
}
其中的几个点:
1. isdigit
是C++中的一个函数,用于检查一个字符是否是数字字符(0-9)。如果字符是数字字符,isdigit
函数返回非零值,否则返回0
2.
unique_digits += to_string(i);
这句代码的作用是将不同的个位数字(i)转换为字符串,并将它们追加到名为 unique_digits
的字符串中。
进一步解释:
-
to_string(i)
:这部分将整数i
转换为对应的字符串。例如,如果i
的值为 5,to_string(i)
将返回字符串 "5"。 -
unique_digits += to_string(i);
:这部分代码使用+=
运算符,将转换后的字符串追加到unique_digits
字符串的末尾。每次循环,它将不同的个位数字(以字符串形式)添加到unique_digits
中。
举例来说,如果输入字符串中有数字 3 和 5,那么 unique_digits
变量将包含字符串 "35"。这是为了将不同的个位数字都保存在一个字符串中,以便后续对它们进行排序和输出。
3.
可以变成下面这种
但仍然需要把字符转化成数字,不然会报错。