题目:

数出0到n(含)中数字2出现了几次。

思路:

1、暴力方法,数出每个数字包含几个2,然后累加起来。

2、分析:分别考虑数字n每一位出现2的次数,如123123;

从左往右考虑4123123;

考虑第一个1(即第6位),该位出现2的次数为4*10^6/10;

考虑第一个2(即第5位),该位出现2的次数为41*10^5/10+3123+1;

考虑第一个3(即第4位),该位出现2的次数为(412+1)*10^4/10;

附:除以10的原因在于:每10个数字,任意位出现2的概率为1/10.

总结规律:

第i位出现2个次数与该位所在的数字有关:

当第i位的数字小于2,出现次数就等于比其高位部分的数字*10^i/10,

当第i位的数字等于2,出现次数就等于比其高位部分的数字*10^i/10+n%(10^i),

当第i位的数字大于2,出现次数就等于(比其高位部分的数字+1)*10^i/10。

代码:

#include<iostream>
#include<sstream>
#include<math.h>
using namespace std; template<class out_T,class in_T>
out_T convert(const in_T &t){
stringstream ss;
out_T result;
ss<<t;
ss>>result;
return result;
} int count2sInRangeAtDigit(int number,int d){
int powerOf10=pow(,d);
int nextPowerOf10=powerOf10*;
int right=number%powerOf10; int roundDown=number-number%nextPowerOf10;
int roundUp=roundDown+nextPowerOf10; int digit=(number/powerOf10)%;
if(digit<)
return roundDown/;
else if(digit==)
return roundDown/+right+;
else
return roundUp/;
} int count2sInRange(int number){
int count=;
string str;
str=convert<string>(number);
int len=str.size(); for(int digit=;digit<len;digit++)
count+=count2sInRangeAtDigit(number,digit);
return count;
} int main(){
int n;
while(cin>>n){
cout<<count2sInRange(n)<<endl;
}
return ;
}

(算法)从0到n整数中数字2出现的次数的更多相关文章

  1. 233. Number of Digit One *HARD* -- 从1到n的整数中数字1出现的次数

    Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...

  2. 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

    输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...

  3. 计算1至n中数字X出现的次数

    描述 计算 1 至 n 中数字 X 出现的次数,其中 $n \ge 1,X \in [0,9]$. 解题思路 这是一道比较简单的题目,举个例子先:假设 $n=11, X=1$,那么就是求 1, 2, ...

  4. 1到n的整数中,1出现的次数

    参考链接:https://discuss.leetcode.com/topic/18054/4-lines-o-log-n-c-java-python 1到n的整数中,1出现的次数,如11中,1出现了 ...

  5. 编程算法 - 从1到n整数中1出现的次数 代码(C)

    从1到n整数中1出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整数n, 求从1到n这n个整数的十进制表示中1出现的次数. ...

  6. 计算1至n中数字X出现的次数【math】

    转自: nailperry 一.1的数目 编程之美上给出的规律: 1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字 ...

  7. 冒泡算法给0~9随机n位数字排序

    <?php //产生5位0~9的随机数      function getRand($begin=0,$end=9,$limit=5){                $rand_array=r ...

  8. 求一个区间[a,b]中数字1出现的次数

    问题来源:http://ac.jobdu.com/problem.php?pid=1373 举例:如果n=10 那么1-10之间的1的个数是2(1,2,3,4,...10) 这其中有一个规律: 挨着看 ...

  9. 1~n中数字0~9出现的次数

    题意:rt 分析: 当然不可能去遍历,应该寻找统计的方法. 如计算 78501 中 "5" 出现的次数. 我们可以枚举“5”出现的位置, 如当“5”位于倒数第2位时,写成 xxx5 ...

随机推荐

  1. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  2. delphi 结构体和TList的用法

    type  PRecord = ^TMyRec;  TMyRec = record    s: string[8];    i: integer;    d: double;end;var   MyL ...

  3. unlocked_ioctl和compat_ioctl

    参考: https://www.cnblogs.com/super119/archive/2012/12/03/2799967.html https://lwn.net/Articles/119652 ...

  4. 让DELPHI自带的richedit控件显示图片

    让DELPHI自带的richedit控件显示图片 unit RichEx; { 2005-03-04 LiChengbin Added: Insert bitmap or gif into RichE ...

  5. iPhone上将短信内容发送到指定邮箱的方法

    iPhone上将短信内容发送到指定邮箱的方法 迄今为止,移动应用安全基本聚焦在以下几个方面,一是移动设备管理BYOD(bring your own device),二是移动恶意软件分析,三是移动设备用 ...

  6. Git:配置

    概念 一般在新的系统上,我们都需要先配置下自己的Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git 提供了一个叫做git ...

  7. jQuery - 同时添加click和dblclick事件

    添加事件的代码比较简单,有两种方法: $("abc").bind({"click":fn,"dblclick":fn}); $(" ...

  8. xheditor-文件上传-java-支持html5-application/octet-stream

    package reyo.sdk.utils.file; import java.io.BufferedOutputStream; import java.io.File; import java.i ...

  9. 每天一个linux命令-用户之间切换

    怎么从root用户切换到普通用户 su是在用户间切换,可以是从普通用户切换到root用户,也可以是从root用户切换到普通用户.如果当前是root用户,那么切换成普通用户test用以下命令:su - ...

  10. 管理Mysql常用指令

    知识会更新,数据库系统也一样,本文只保证对Mysql 5.7以及MariaDB 10有效. 编码篇 展示当前默认的编码和字符集 SHOW VARIABLES LIKE 'char%'; 修改服务器默认 ...