L1-003. 个位数统计
时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越
题目描述
给定一个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
题目网址:(https://www.patest.cn/contests/gplt/L1-003)
题意:
输入一个不超过1000位的正整数N;统计每种不同的个位数字出现的次数,并以D:M的格式在一行中输出该位数字D及其在N中出现的次数M,要求按D的升序输出。
思路:
第一眼看到这个题的时候想的是用通过取余数的方法把数分离,但这个数是太大了,所以用字符串来表示是最好的了;然后把字符串类型数字化处理就行了,D的升序输出用个循环使D慢慢增加就行了。
代码:
#include<string>//string头文件声明
#include<iostream>//C++头文件声明
using namespace std;
int main(int argc,char* argv[])
{
string s;//创建string对象
char ss[1000];//定义字符串ss
int i,n,j;
cin>>ss;//输入字符串ss
s=ss;//string对象赋值
for(j=0;j<=9;j++)//按D的升序输出所用
{
n=0;
for(i=0;i<s.length();i++)//s.length返回string的长度
{
if(s[i]-'0'==j)//string类型数字化处理
n++;
}
if(n!=0)
cout<<j<<":"<<n<<endl;//输出格式j:n;回车换行
}
return 0;
}
map
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<char,int> m;
string s;
cin>>s;
for(int i=0;i<10;i++) //插入键值'0'-'9'数据初始值都为0
{
m[i+'0']=0;
}
for(int i=0;i<s.length();i++)
{
m[s[i]]++; //键值对应的数据++
}
map<char,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
if((*it).second!=0) //数据不为0输出
cout<<(*it).first<<":"<<(*it).second<<endl;
}
return 0;
}
运行结果:
总结:
碰到数比较大的并要把数分离开,利用字符串是个很好的办法,再次感受到到了C++的好处。
以后继续努力!加油!