每日一题(10)——统计连续数字中1的个数

该博客探讨了如何计算从1到给定十进制数N之间所有连续数字中数字1出现的总数。通过实例解析,解释了解决这一问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

输入十进制数字N,统计从1到N的连续数字中,所有的1出现的次数。

 

例如:

N = 3,   f(3) = 1 (只有一位数字的情况)
(两位数字的情况)
N = 13, f(13) = 6          2+4
N = 23 ,f(23) = 13        3+10
N = 33, f(33) = 14       10+4
……
N = 99, f(99) = 20       10+10
 
N = 123
个位出现1个数:13
十位数出现1个数:20
百位出现1个数:24
同理,我们可以分析4位数、5位数。。。
 
 
总结规律:
计算方法:可以通过分别计算每一位上出现1的次数,最后加和统计一共出现的次数
 
引出问题:
怎样计算某一特定位上1出现的次数?
假设N=abcde,要计算其百位上1出现的次数,
它受到三个因素的影响:百位以上的数字,百位以下的数字,百位上的数字
 
当百位数字c=0时,百位上出现1的次数只受百位以上的数字影响
12045:百位上1出现的次数为12*100=1200 次
当百位数字c=1时,百位上出现1的次数只受百位以上的数字,百位以下的数字共同影响
12145:百位上1出现的次数为12*100+45+1 次
当百位数字c>1时,百位上出现1的次数只受百位以上的数字影响
12345:百位上1出现的次数(12+1)*100=1300次
 
其他各位也是依然这样计算。
 
#include <iostream>

using namespace std;

void fun(int N)
{
	int factor=1;
	int count=0;
	int low,cur,high;
	while (N/factor)
	{
		low = N - (N/factor)*factor;
		cur = (N/factor)%10;
		high = N/(factor*10);
		
		switch(cur)
		{
		case 0:
			count += high*factor;
			break;
		case 1:
			count += high*factor+low+1;
			break;
		default:
			count += (high+1)*factor;
			break;
		}

		factor *=10;
	}
	cout<<count<<endl;
}

int main()
{
	int n;
	while(cin>>n)
	{
		if(n==-1) break;
		fun(n);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值