编程之美2.4——1的数目

本文介绍了一种高效算法,用于计算从1到任意正整数N之间所有数字中数字1出现的总次数。通过分析个位、十位、百位等位数上1出现的规律,提出了一个递进式的计算方法。

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

/*总体思路:先求个位上出现的1的个数,再找十位再找百位。。
先看个位找找规律:
 5(05)     1    1
 15        2    1,11  
 25        3    1,11,21
 35        4    1,11,21,31
 ...
 325       33   1,11,21,31,41,...,301,311,321
 结论:个位上的1的数目s= N / 10 + 1;


 再看十位,找找规律:
 25        10    10,11,12,13,14,15,16,17,18,19
 35        10    10,11,12,13,14,15,16,17,18,19
 95        10    10,11,12,13,14,15,16,17,18,19
 125       20    10,11,12,13,14,15,16,17,18,19,110,111,112,...,118,119
 725       80    10-19,110-119,210-219,310-319,410-419,510-519,610-619,710-719
 3225      330   10-19,20-29,...510-519,610-619,...1010-1019,1110-1119,1210-1219,...,3110-3119,3210-3219
 结论:十位上的1的数目s = (N / 100 + 1) * 10;
 ....
 将个位上的1的数目看作
 (N / 10 + 1) * 1;
 (N / 100 + 1 ) * 10; 十位上的
 猜想百位上1的数目应该是:
 (N / 1000 + 1 ) * 100


 特殊情况,当最高位为1时,最高位上1的数目为其余各位所组成的数加1,如125百位上的1的个数就是25+1=26个
 */

 

int numberOf1In1_N(int n)//从1到n的整数中1出现的次数
{
 if (n == 0)
  return 0;
 else if(n > 0 && n < 9)
  return 1;
 int i = 1;
 int j = 10;
 int count = 0;
 while(n / j)
 {
  int tmp = n / j;
  count += (tmp + 1) * i;
    
  if(tmp == 1)
   count +=  n % j + 1;
  i *= 10;
  j *= 10;
 }
 return count;  
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值