(算法)从0到n整数中数字2出现的次数
题目:
数出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出现的次数的更多相关文章
- 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 ...
- 输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少
输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9.因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字 ...
- 计算1至n中数字X出现的次数
描述 计算 1 至 n 中数字 X 出现的次数,其中 $n \ge 1,X \in [0,9]$. 解题思路 这是一道比较简单的题目,举个例子先:假设 $n=11, X=1$,那么就是求 1, 2, ...
- 1到n的整数中,1出现的次数
参考链接:https://discuss.leetcode.com/topic/18054/4-lines-o-log-n-c-java-python 1到n的整数中,1出现的次数,如11中,1出现了 ...
- 编程算法 - 从1到n整数中1出现的次数 代码(C)
从1到n整数中1出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整数n, 求从1到n这n个整数的十进制表示中1出现的次数. ...
- 计算1至n中数字X出现的次数【math】
转自: nailperry 一.1的数目 编程之美上给出的规律: 1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字 ...
- 冒泡算法给0~9随机n位数字排序
<?php //产生5位0~9的随机数 function getRand($begin=0,$end=9,$limit=5){ $rand_array=r ...
- 求一个区间[a,b]中数字1出现的次数
问题来源:http://ac.jobdu.com/problem.php?pid=1373 举例:如果n=10 那么1-10之间的1的个数是2(1,2,3,4,...10) 这其中有一个规律: 挨着看 ...
- 1~n中数字0~9出现的次数
题意:rt 分析: 当然不可能去遍历,应该寻找统计的方法. 如计算 78501 中 "5" 出现的次数. 我们可以枚举“5”出现的位置, 如当“5”位于倒数第2位时,写成 xxx5 ...
随机推荐
- Git+SourceTree使用时出现的问题
今天重新用Git+SourceTree添加代码,出现了很多问题,记录下: 1.安装了我SourceTree后克隆项目,粘贴网址后出现Url不正确的情况. 解决: (寻找了些资料,大仙大部分都是说直接选 ...
- 3I工作室的成员在2013年(第6届)中国大学生计算机设计大赛总决赛中荣获全国二等奖
在暑假举行的2013年(第6届)中国大学生计算机设计大赛中,我院的参赛作品<毕业生论文选导系统>(作者:祝丽艳/许明涛:指导老师:元昌安/彭昱忠)入围总决赛,并荣获全国二等奖. 2013年 ...
- 大不列颠百科全书Encyclopaedia Britannica Ultimate 2014光盘镜像
大不列颠百科全书又名大英百科全书,是目前最古老的百科全书之一.大英百科全书每10余年出一个版本,如今已经推出到Encyclopaedia Britannica Ultimate 2014.此次推荐的是 ...
- Selenium:Hello,World!
背景 伟鹏同学在学习自动化测试了,开发人员也有必要学习一下,有如下好处: 可以开发一些小工具. 可以熟悉一下自动化测试开发技术. 代码 using System; using Microsoft.Vi ...
- X、Y轴抖动的动画
实现这个动画效果用到了interpolator属性,这样就能让一些控件产生自定义的抖动效果 这是用作interpolator的文件,用来做动画循环 cycle.xml <?xml version ...
- 获得手机当前的ip地址
package com.kale.floating.net; import java.net.Inet4Address; import java.net.InetAddress; import jav ...
- PHP Curl实例
URL Link : http://www.groad.net/bbs/forum-115-1.html
- nodejs中thiskeyword的问题
再分析详细内容之前,必需要好好阅读下面下面两篇blog 学习Javascript闭包(closure) Javascript的this使用方法 这两篇文章是阮一峰老师对Javascript的闭包和th ...
- 解决:CentOS下的 error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or dir
进入别人的centos,输入命令 mysql mysqladm都会报错,缺少这个共享库 libmysqlclient.so.16 . 查找下,一般都是ldconfig 没有找到共享库的位置,或者 软链 ...
- 《嵌入式系统原理与接口技术》——嵌入式系统接口应用基础
本文为我负责编写的电子工业出版社出版的<嵌入式系统原理与接口技术>一书第七章部分,这里整理的仍然是修改稿,供需要的同学参考,本书为普通高等教育"十二五"规划教材,电子信 ...