(算法)从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 ...
随机推荐
- golang 引用相对路径package
My $GOPATH is "/Users/peter/goworkspace" Golang 版本是: go version go1.6 darwin/amd64 在这个work ...
- CPU和线程的关系
比如,电脑开了两个程序qq和qq音乐,假设这两个程序都只有一个线程.人能够感觉到CPU切换的频率是一秒一次,假设当前cpu计算速度是1秒1次,那么我们就能明显感到卡顿,当聊天,点击发送按钮时候,qq音 ...
- SpringBoot集成JWT实现token验证
原文:https://www.jianshu.com/p/e88d3f8151db JWT官网: https://jwt.io/ JWT(Java版)的github地址:https://github. ...
- C#中的Hashtable
richTextBox1.Text = ""; Hashtable ht = new Hashtable(); ht.Add("); ht.Add("); ht ...
- Protocol Buffer Basics: C#
Protocol Buffer 基础知识:c# 原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial ...
- ibatis.net:第六天,QueryForList
xml <statement id="FindOrdersByCustomer" parameterClass="string" resultClass= ...
- redis + Tomcat 8 的session共享解决
如果英文不错的看,建议直接看官网吧,官网写的挺清楚.下面的内容是转载的一篇文章,自己补充了一些,供大家参考,也欢迎大家一起讨论 官方截止到2015-10-12前是不支持Tomcat8的,详情见官网:h ...
- 获得手机当前的ip地址
package com.kale.floating.net; import java.net.Inet4Address; import java.net.InetAddress; import jav ...
- [Android Pro] 深入理解函数的调用过程——栈帧
cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先 ...
- django的日志发往http server
配置示例: # https://docs.djangoproject.com/zh-hans/2.1/topics/logging/ LOGGING = { , 'disable_existing_l ...