给定一个k位整数N = dk-1*10k-1 + … + d1*101 + 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
思路:计算出位数K,通过取余和整除将每位的数字弄出来就好了。 原本是想用map,在每个数字与其出现的次数之间建立映射,但是发现其实用数组就好了。像本题编号从0~n,数组的元素值和下标就是再好不过的映射。
用不同的数据类型存储N如下:
基于int类型实现:
#include <cstdio>#include <cstring>#include <cmath>using namespace std;int getK(int N){ //获得K int i=1,t=10; while(N-t>=0){ i++;t*=10; } return i;}int main(){ int N,k; int number[10]; memset(number,0,sizeof(number)); scanf("%d",&N); k=getK(N); int num; for(int i=0;i<k;i++){ int num=N%(int)pow(10,i+1)/(int)pow(10,i); number[num]++; } for(int i=0;i<10;i++){ if(number[i]){ PRintf("%d:%d/n",i,number[i]); } } return 0;}注意点:按理说这题真的很容易,然而我还是调了1h。。。错误的原因在于,取余整除运算中涉及10的i次方,使用的是如下代码:
int num=N%10^(i+1)/10^i;但是,C++中并不能使用^进行乘方运算!!! 需要使用pow函数:
int num=N%(int)pow(10,i+1)/(int)pow(10,i);pow()函数: 1.函数原型: double pow(double x,double y) 所在头文件——math.h 2.pow(x,y)用于计算x的y次方,x,y可以是小数 3.其返回的是double类型,在形参为int类型的时候(如本题的%的操作数需要是int类型),需要显示转换。
基于char N[]实现:
#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int maxn=1000;int main(){ char N[maxn]; scanf("%s",N); int k=strlen(N); int number[10]; memset(number,0,sizeof(number)); for(int i=0;i<k;i++){ number[N[i]-'0']++; } for(int i=0;i<10;i++){ if(number[i]){ printf("%d:%d/n",i,number[i]); } } return 0;}但是在OJ上只通过了基于字符串的,究其原因,是因为N的最大位数到达了1000位,根本无法用int储存。这题也启示自己: 关注数据的大小,看是否能被存储。
新闻热点
疑难解答