个位数统计(C++实现)
给定一个 k 位整数 N=d**k−110k−1+⋯+d1101+d0 (0≤d**i≤9, i=0,⋯,k−1, d**k−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>
using namespace std;
int main()
{
int N,a[1000],n,b[10]={0};
cin>>N;
for(int i=0;;i++)//N的个位数放到a【0】,十位数放到a【1】···以此类推
{
a[i]=N%10;
N=N/10;
n=i;
if(N==0) break;
}
for(int i=0;i<=n;i++)//我是个渣渣,远哥教的输出方法,无法用语言形容,一个字,棒!
b[a[i]]++;
for(int i=0;i<10;i++)
if(b[i]!=0)
cout<<i<<":"<<b[i]<<endl;
}
因为:当输入0000时,输出为“0:1”,这种情况我想不出来解决办法了。
第二版,远哥的代码:答案正确
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int main()
{
map<int,int> mmap;
string str;
cin>>str;
for(int i=0;i<str.length();i++)
mmap[str[i]-48]++;//str[i]-48是将字符型转化为整形
auto iter=mmap.begin();//听说叫迭代器,但我搞不懂
while(iter !=mmap.end())
{
cout<<iter->first<<":"<<iter->second<<endl;
iter++;
}
}
答案正确。
说实话,我还是有点看不懂。慢慢来吧。
第三版简易版:答案正确(远哥的)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int b[10]={0};
string str;//将输入的N设置为字符串型
cin>>str;
for(int i=0;i<str.length();i++)
b[str[i]-48]++;//str[i]-48是将字符型转化为整形
for(int i=0;i<10;i++)
if(b[i]!=0)
cout<<i<<":"<<b[i]<<endl;
}
第四版更简易版代码(远哥的):(我最喜欢这种代码了)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char str[1002];
int n[10] = { 0 };
cin >> str;
for (int i = 0; i < strlen(str); i++)
{
switch (str[i])
{
case '0':n[0]++; break;
case '1':n[1]++; break;
case '2':n[2]++; break;
case '3':n[3]++; break;
case '4':n[4]++; break;
case '5':n[5]++; break;
case '6':n[6]++; break;
case '7':n[7]++; break;
case '8':n[8]++; break;
case '9':n[9]++; break;
}
}
for (int i = 0; i < 10; i++)
if (n[i] != 0) cout << i << ":" << n[i] << endl;
}