题目:把前n(n<=10000)个整数顺次写在一起:123456789101112···数一数0~9各出现多少次(输入10个整数,分别是0,1,···,9出现的次数)
例如:输入:15,
输出:1 8 2 2 2 2 1 1 1 1
分析:1.将一个个整数转化为字符串数组的形式。
法1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int count[10];
char buf[6];
int T;
scanf("%d",&T);
while(T--)
{
memset(count,0,sizeof(count));
//初始化两个数组
memset(buf,0,sizeof(buf));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
//将一个整数输入字符串,然后进行统计,再将下一个整数输入字符串。
{
sprintf(buf,"%d",i);
for(int j=0;buf[j]!='\0';j++)
count[buf[j]-'0']++;
}
int first=1;
for(int i=0;i<10;i++)
{
if(first)
first=0;
else
printf(" ");
printf("%d",count[i]);
}
}
return 0;
}
法2:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define max 40000+10
int main()
{
char s[max];
int T;
scanf("%d", &T);
while (T--)
{
int n;
int first = 1;
scanf("%d", &n);
char*p = s;
//这块程序笔者是利用画图的方式来理解指针的移动
for (int i = 1; i <= n; i++)
{
sprintf(p, "%d", i);
if (i < 10) p++;
//根据位数来控制指针p在字符串数组的指向
else if (i < 100) p += 2;
else if (i < 1000) p += 3;
else if (i < 10000) p += 4;
else p += 5;
}
int a[10];
memset(a, 0, sizeof(a));
int len = strlen(s);
for (int i = 0; i < len; i++)
{
a[s[i]-'0']++;
}
for (int i = 0; i < 10; i++)
{
if (first)
first = 0;
else
printf(" ");
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}