求1的数目

题目:

给定一个十进制的正整数N,求从1开始到N的所有整数中,出现1的个数。

如:N=2,即1,2,出现11

N=12,即1,2,3,4,5,6,7,8,9,10,11,12,出现51.

写一个函数f(N),返回1N之间出现1的个数,如f(12)=5.

注意:请你在写完基本功能代码V1.0版本后进行压力测试,看看当N=100000000N=1000000000你的代码还能否运算出结果。如果无法在短时间内运算出结果,请你改进算法,完成一个能通过压力测试的v2.0版本代码。

代码如下:

#include "stdio.h"
int main()
{
	__int64 i,a,b,c,num,count=0;
	scanf("%I64d",&num);
	for(i=10;i<=10000000000;i*=10)
	{
		a=num/i;
		b=(num-a*i)/(i/10);
		c=num%(i/10);
		switch(b)
		{
			case 0:
				count+=a*i/10;
				break;
			case 1:
				count+=a*i/10 + c+1;
				break;
			default :
				count+= ( a+1 )*i/10;
		}
		if(num/i<=0)
			break;
	}
	printf("%I64d\n",count);
	return 0;
}

设count为1的总个数,i=1,10,100,1000......

当b==0时,n += a*i;

当b==1时,n += a*i+c+1;

当b>=2时,n += (a+1)*i;


比如输入12345(F(12305)=8121)

计算个位数(i=1)时,将12305分为a:1230 b:5 c:0

因为b>=2

n += (a+1)*i;

计算十位数(i=10)时,将12305分为a:123 b:0 c:5

因为b==0

n += a*i;

        .

        .

        .

计算万位时(i=10000)时,将12305分为a:0 b:1 c:2305

因为b==1

n += a*i+c+1;

n即为1的总个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值