给定一个 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
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
这道题卡了有几天,因为写一点卡一点。我先写出了用取余的方式来进行整数的各位分离。但是这样计算量很大,不能分离1000位的整数。但是我丝毫没有意识到。
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
int n=N;
int i=1;
int a[1010];
while(n>0){
a[i]=n%10;
i++;
n=n/10;
}
for(int k=1;k<=i-1;k++)
printf("%d ",a[k]);
return 0;
}
就是这段代码,我很天真的一位他真能到1000位!!!但是家人们可以试一下 ,只能10位。(时间复杂度我还没学。)
用这个方法做的本题只能11分,以为只能算到10位,只有两个测试数据是对的。
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
int n=N;
int i=1;
int a[1010];
while(n>0){
a[i]=n%10;
i++;
n=n/10;
}//整数各位分离
/*for(int k=1;k<=i-1;k++){
printf("%d ",a[k]);
}*/
int count=0;
int b[10];
for(int j=0;j<=9;j++){
for(int k=1;k<=i-1;k++){
if(a[k]==j) count++;
b[j]=count;
}
count=0;
}//计算不同个位数字个数
for(int k=0;k<=9;k++)
{
if( b[k]!=0)printf("%d:%d\n",k,b[k]);
}//输出
return 0;
}
于是我上网搜了别人的做法,用字符串数组做。可是我......看不懂,对字符串数组和ASCII码不太清楚,于是学习了一番。这是用别人的思想写的,各位分离。
char a[1010];
int b[10];
scanf("%s",&a);
for(int k=0;k<strlen(a);k++)
{
if(a[k]-48==i)
b[i]++;
}
我开始不太看得懂,做了一些功课。
就这样我写出来啦
#include<stdio.h>
#include<string.h>
int main()
{
char a[1010];
int b[11]={0};
scanf("%s",&a);
for(int i=0;i<=9;i++ )
{
for(int k=0;k<strlen(a);k++)
{
if(a[k]-48==i)
b[i]++;
}
}
for(int j=0;j<=9;j++)
if(b[j]!=0 )printf("%d:%d\n",j,b[j]);
return 0;
}
下一次写,我决定把做题的过程中参考的文章链接直接放在文章里 。