程序设计入门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)里好退出。
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值