把前n(n≤10000)个整数顺次写在一起:123456789101112…数一数0~9各出现多少次(输出10个整数,分别是0,1,…,9出现的次数)。
一,题意解析
一开始认为只是输入一串数,然后统计里面0到9的个数,例如11212会输出032000000。
但不是这样的,实际上是输入10 它会吧12345678910连成一串,然后统计0到9的个数。
不要想着用sprintf(),它只会连接括号内的数字。例如:
n=10;
int array[10];
while(n)
{
sprintf(array,"%d",n);
n--
}
只会给数组内赋入一个1.
二,我的答案
#include<stdio.h>
#include<string.h>
int count[10];
int main()
{
int num;
int i;
int bit;
memset(count,0,sizeof(count));
while (scanf("%d", &num) == 1)
{
for (i = 1; i < num; i++)
{
if (num / 10 == 0)
{
count[i]++;
}
else if (num / 100==0)
{
bit = i % 10;
count[bit]++;
bit = i / 10;
count[bit]++;
}
}
for (i = 0; i < 10; i++)
{
printf("%d\n",count[i]);
}
}
return 0;
}
主要是要解决输入的那个数有几位的问题,好确定拆开多少次,这里的方法很笨,就是用if使位数不同的数便有不同的处理方法。
三,标准答案
#include<stdio.h>
#include<string.h>
int count[10];
int main()
{
int n;
int i;
memset(count,0,sizeof(count));
while (scanf("%d", &n) == 1)
{
for (i = 1; i <= n; i++)
{
int x = i;
while (x > 0)
{
count[x % 10]++;
x /= 10;
}
}
for (i = 0; i < 10; i++)
{
printf("%d\n",count[i]);
}
}
return 0;
}
这里的一个有价值的东西就是使用x/=10对每一位进行处理,这一句包含在while(x>0)里好退出。