程序设计入门10 数数字

把前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)里好退出。


猜你喜欢

转载自blog.csdn.net/qq2285580599/article/details/79095229