个位数统计
题目:
请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:
每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:
对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
1. 错误示范:
#include<iostream>
using namespace std;
int main()
{
string N;
cin >> N;
char arr[10] = { '0','1','2','3','4','5','6','7','8','9'};
int digits = N.length(); //计算字符串长度
for (char c:N)//逐个字符遍历字符串N
{
//将字符与字符数组的下标相互关联
arr[c - '0']++;//用字符表示字符数组下标
}
//遍历并且是从小到大升序
for (int i = 0; i < 10; i++) {
if (arr[i]!='i')//只输出那些发生改变的键值对
cout << i << ":" << arr[i]- 'i' << endl;
}
return 0;
}
//错误原因:在最后for循环时,假设i=9,那么'i'不是表示字符'9',而是字符'i'
2.正解
这段代码首先读取输入的整数N,将其存储为字符串类型。 然后使用 map 容器 digitCount 来统计每个个位数字出现的次数。 通过遍历字符串N中的每个字符,将字符作为键,将出现次数作为值,存储在 digitCount 中。 如果字符已经存在于 digitCount 中,则值加1;否则,将字符添加到 digitCount 中,并将值初始化为1。 最后,使用 for 循环遍历 digitCount 中的每个键值对,并按照键的升序输出个位数字和出现次数。
正确代码:
#include<iostream>
#include<map>
//map是用来存储键值对的关联容器,可以理解为一张地图(每个键都会对应相应的值)
using namespace std;
int main()
{
//整数N过大时不可有整形或者长整形表示
string N;//定义一个字符串N用于存储输入的整数
cin >> N;
//定义一个名叫digitcount的关联容器用于存储键值对
map<char, int>digitcount;//char是键的类型,int是值的类型
for (char c : N)//逐个字符遍历字符串N
digitcount[c]++;
//键是关联容器digitcount的下标,下标c对应的值为digitcount[c]
//当且仅当出现了键c时才会有对应的值digitcount[c]
//digitcount[c]表示字符串中字符c出现的次数
//digitcount是一个map容器,其会自动按照键的升序排列
for (auto it : digitcount)//auto可以自行判断迭代器it的类型
cout << it.first << ":" << it.second << endl;
//it是一个迭代器,用于表示一个键值对,it.first表示当前迭代的键,it.second表示当前迭代的值
//如果不使用auto,则最后一段代码为:
/*for (map<char, int>::iterator it = digitcount.begin(); it != digitcount.end(); ++it) {
cout << it->first << ":" << it->second << endl;
}*/
//map<char, int>::iterator表示迭代器it类型
//为何前者是点运算符,后者是箭头运算符?
/*点运算符访问对象的成员,箭头运算符用于访问指针所指向的对象的成员。
即前者it是一个迭代器对象,后者it为一个指向迭代器的指针*/
return 0;
}
#一个极大整数的个位数统计#