NYOJ 514 数字 1的个数

1的个数

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
给你两个数a和b,你的任务是计算出1在a和b之间出现的次数,比如说,如果a=1024,b=1032,那么a和b之间的数就是:
1024 1025 1026 1027 1028 1029 1030 1031 1032
则有10个1出现在这些数中。
输入
输入不会超过500行。每一行有两个数a和b,a和b的范围是0 <= a, b <= 100000000。输入两个0时程序结束,两个0不作为输入样例。
输出
对于每一对输入的a和b,输出一个数,代表1出现的个数。
样例输入
1 10
44 497
346 542
0 0
样例输出
2
185
40


主体思想是找出每一个数为上的1的个数,就是说 个位一共出现几个一,十位一共出现了几个1``````

可以考虑写一个函数求出1到n的数中一共的1的个数


 
#include<stdio.h>
int m[12]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int geshu(int t)
{
	if(t==-1)return 0;
	int i=0,res=0;
	while(1)
	{
		if(m[i]>t)break;
		if((t/m[i])%10>1)
		{
			res+=((int)t/m[i+1]+1)*m[i];
		//	printf("%d*\n",res);
		}
		else if((t/m[i])%10==1)
		{
			res+=((int)t/m[i+1])*m[i]+t%m[i]+1;
			//	printf("%d**\n",res);
		}
		else
		{
			res+=(int)t/m[i+1]*m[i];
			//	printf("%d***\n",res);
		}		
		++i;
	}
	return res;
}

int main()
{
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF)
	{
		if(a==0&&b==0)break;
		if(a>b){a^=b^=a^=b;}
		printf("%d\n",geshu(b)-geshu(a-1));
	}return 0;
}        




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值