当前位置: 首页 > ops >正文

洛谷 P1179【NOIP 2010 普及组】数字统计 —— 逐位计算

题面:P1179 [NOIP 2010 普及组] 数字统计 - 洛谷


 

一:题目解释:

        需要求一区间内数字 2 的出现次数。注意22则记为 2 次,其它没别的...


 

二:思路、

  • 思想可以考虑动态规划
  • 需要计算在每一位上数字 的出现次数,然后将这些次数相加
  • 对于每一位,我们可以根据该位上的数字是小于、等于还是大于 分别来计算

 

三:符号定义、

  • n:当前考虑的数字
  • i:当前考虑的位(1代表个位,10代表十位,以此类推)
  • div:用于获取当前位的值,例如,如果考虑十位,则div为10
  • h:当前位以上的数字组成的数
  • c:当前位的数字
  • l:当前位以下的数字组成的数

 

四:公式推导、(具体公式建议自行理解)
    1.当前位数字小于2

  • 如果当前位的数字小于 ,那么各位上不可能出现 2
  • 例如,对于数字 1234,考虑百位,百位是2,但如果我们考虑十位(3),则视为上不可能有 2
  • 这种情况下,数字 的出现的次数为 0

    2.当前位数字等于2

  • 如果当前位数字等于 2,那么数字 出现的次数由高位决定,低位可以是任意数字
  • 例如,对于数字 1234,考虑百位,百位是 2,2 可以出现在 1200~1229 之间,共 30 
  • 这种情况下,数字2的出现次数为 h*div + l+1

    3.当前位数字大于2

  • 如果当前位数字大于2,那么数字2可以出现在这个位上的所有可能情况
  • 例如,对于数字1234,考虑千位,千位是1,运行不了(但能运行则2可以出现在2000~2999之间,共1000次)
  • 这种情况下,数字2的出现次数为 (h+1)*div

 

五:综合公式、(c < 2 为 0)

    num = 0;if(c == 2)  num = h*div + l+1;else if(c > 2)  num = (h+1) * div;

 

六:示例运行、

0+135+130+1241   2   3   4(123+1)*1                                            (12+1)*10                                                1*100 + 34+1                                                   0ans = (0) + (1*100 + 34+1) + ((12+1)*10) + ((123+1)*1)= 0 + 135 + 130 + 124= 389

七:Code Ed、

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;inline int CD(int n, int d){int num = 0;int div = 1;int l,c,h = 0;while(n / div != 0){l = n - (n/div)*div;//更新低位c = (n/div) % 10;//当前位数字h = n / (div*10);//更新高位if(c < d){num += h*div;//当前位小于d,不计数,但别忘了加上以前的}else if(c == d){num += h*div + l+1;//当前位等于d,增加 高位*div +低位+1}else{num += (h+1) * div;//当前位大于d,增加 (高位+1) * div}div *= 10;//移到下一位}return num;
}signed main(void){ios::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);int l,r;cin >> l >> r;int ans = CD(r, 2)-CD(l-1, 2);cout << ans << "\n";return 0;
}

八:补:至于这道题,为啥发...有个进阶版位运算算法,还搞不懂。暂且整个逐位计算算法,后续补档。(见动态图片)

http://www.xdnf.cn/news/5029.html

相关文章:

  • 等保系列(三):等保测评的那些事
  • [特征工程]机器学习-part2
  • ABB电机保护单元通过profibusDP主站转profinet网关接入到西门子1200plc系统
  • MapStruct用法实战
  • STL-vector
  • 对比学习入门
  • Unity按钮事件冒泡
  • 20.java反序列化-对象的类自定义的readObject()方法
  • 【算法】:滑动窗口
  • C++八股 —— vector底层
  • OpenHarmony launcher开发——删除dock栏
  • MegaCLI Raid管理工具
  • 如何训练deepseek语言大模型
  • 数据结构(1)复杂度
  • QT事件介绍及实现字体放大缩小(滚轮)
  • LIMIT详解
  • 在一个FreeBSD的控制台,当移动鼠标时,就会有字符发生,这是怎么回事:35;62;18m35;60;
  • 【PhysUnits】3.2 SI 量纲 补充幂运算(dimension/mod.rs)
  • 低成本自动化改造的18个技术锚点深度解析
  • STM32-TIM定时中断(6)
  • MOS管的优缺点及应用
  • CMA认证对象?CMA评审依据,CMA认证好处
  • python打卡day20
  • C++ —— 类的嵌套和循环依赖问题
  • SCDN是什么?
  • 如何避免双击时触发单击事件
  • 自然语言处理 (NLP) 技术发展:从规则到大型语言模型的演进之路
  • C++ 引用传参机制
  • Oracle Fusion常用表
  • AD 绘制原理图--元件的放置