个位数统计

题目:

请编写程序统计每种不同的个位数字出现的次数。例如:给定 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;
}
#一个极大整数的个位数统计#
全部评论

相关推荐

工科女的日常:真诚建议:别再用这种花哨的模板,可以看看我发的那个零经验找实习发帖子
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务