统计0到n之间1的个数
问题描写叙述
给定一个十进制整数N,求出从1到N的全部整数中出现”1”的个数。
比如:N=2时 1,2出现了1个 “1” 。
N=12时 1,2,3,4,5,6,7,8,9,10,11,12。
出现了5个“1”。
解题思路
1位数的情况:
在解法二中已经分析过,大于等于1的时候。有1个,小于1就没有。
2位数的情况:
N=13,个位数出现的1的次数为2。分别为1和11,十位数出现1的次数为4,分别为10,11,12,13,所以f(N) = 2+4。
N=23,个位数出现的1的次数为3,分别为1,11,21,十位数出现1的次数为10,分别为10~19,f(N)=3+10。
由此我们发现。个位数出现1的次数不仅和个位数有关。和十位数也有关,假设个位数大于等于1,则个位数出现1的次数为十位数的数字加1;假设个位数为0。个位数出现1的次数等于十位数数字。而十位数上出现1的次数也不仅和十位数相关,也和个位数相关:假设十位数字等于1,则十位数上出现1的次数为个位数的数字加1,假如十位数大于1,则十位数上出现1的次数为10。
3位数的情况:
N=123
个位出现1的个数为13:1,11,21,…。91,101,111,121
十位出现1的个数为20:10~19,110~119
百位出现1的个数为24:100~123
我们能够继续分析4位数,5位数,推导出以下普通情况:
假设N,我们要计算百位上出现1的次数。将由三部分决定:百位上的数字,百位以上的数字。百位一下的数字。
假设百位上的数字为0,则百位上出现1的次数仅由更高位决定,比方12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。等于更高位数字乘以当前位数。即12 * 100。
假设百位上的数字大于1,则百位上出现1的次数仅由更高位决定。比方12213,百位出现1的情况为100~199,1100~1199,2100~2199。…,11100~11199。12100~12199共1300个。
等于更高位数字加1乘以当前位数,即(12 + 1)*100。
假设百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。比如12113,受高位影响出现1的情况:100~199,1100~1199,2100~2199。…,11100~11199,共1200个,但它还受低位影响,出现1的情况是12100~12113,共114个,等于低位数字113+1。
实现代码
#include <iostream>
#include <cstring>
using namespace std;
int countOne(int n)
{
int current = 0;
int before = 0;
int after = 0;
int i = 1;
int count = 0;
while (n / i != 0)
{
current = n / i % 10;
before = n / (i * 10);
after = n - (n / i) * i;
if (current > 1)
{
count += (before + 1) * i;
}
else if (current == 0)
{
count += before * i;
}
else if (current == 1)
{
count += before * i + after + 1;
}
i *= 10;
}
return count;
}
int main()
{
int n;
while (cin>>n)
{
cout<<countOne(n)<<endl;
}
return 0;
}
统计0到n之间1的个数的更多相关文章
- 统计0到n之间1的个数[数学,动态规划dp](经典,详解)
问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数. 例如:N=2时 1,2出现了1个 “1” . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个 ...
- Hard 计算0到n之间2的个数 @CareerCup
一种是Brute force,O(nlogn) 另一种是找规律O(n),见http://hawstein.com/posts/20.4.html 当某一位的数字小于2时,那么该位出现2的次数为:更高位 ...
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...
- 求0到n之间素数个数的序列
要求: (1) 找出0-1000之间素数(2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法- ...
- c语言程序设计:用strcpy比较数组(银行卡密码程序设计),strcpy(复制数组内容)和getchar()(敲键盘字符,统计不想要的字符的个数)
统计从键盘输入一行字符的个数: 1 //用了getchar() 语句 2 //这里的\n表示回车 #include <stdio.h> #include <stdlib.h> ...
- 统计无符号整数二进制中1的个数(Hamming weight)
1.问题来源 之所以来记录这个问题的解法,是因为在在线编程中经常遇到,比如编程之美和京东的校招笔试以及很多其他公司都累此不疲的出这个考题.看似简单的问题,背后却隐藏着很多精妙的解法.查找网上资料,才知 ...
- Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。
/** 题目:Help Tomisu UVA - 11440 链接:https://vjudge.net/problem/UVA-11440 题意:给定正整数N和M, 统计2和N!之间有多少个整数x满 ...
- 统计"面"要素中"点"要素的个数.
步骤 1,创建字段 IFields /// <summary> /// 创建:"面"-"点数"的字段. /// </summary> / ...
- [leetcode] 204. Count Primes 统计小于非负整数n的素数的个数
题目大意 https://leetcode.com/problems/count-primes/description/ 204. Count Primes Count the number of p ...
随机推荐
- java web 学习六(servlet开发2)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- 对delegate进行扩展 打造通用的"计时完成"方法 z
让用户尽量少打字 每次让用户输入这么多信息的确很糟糕, 可以改进一下设计: 服务器IP和用户名可以存放在配置文件里面, 初始化的时候默认加载到相应的文本框中; 从安全角度考虑, 密码必须经过用户手动输 ...
- poj 1505 Copying Books
http://poj.org/problem?id=1505 Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submiss ...
- C++虚函数表原理
C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指 向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技 ...
- 2.1……Android中的单位简介
引用自Google API Guides Dimension A dimension value defined in XML. A dimension is specified with a num ...
- Buffer -nodejs
纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据.当我们面对类似 TCP 流或文件系统时,是需要处理八位流的.Node 有几种操作.创建以及消费八位流的策略.原始数据保存 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇05:角色中弹》
5.角色中弹 概述: 为了使游戏具有挑战性,大部分游戏设定中,游戏角色都有生命限制.即在游戏中,由于玩家的操控操控不当,导致游戏角色死亡游戏终止.打飞机游戏也不例外,当敌人击中角色的时候,角色宣判死亡 ...
- Spring Framework 中启动 Redis 事务操作
背景: 项目中遇到有一系列对Redis的操作,并需要保持事务处理. 环境: Spring version 4.1.8.RELEASE Redis Server 2.6.12 (64位) spring- ...
- linux 下终端复用软件推荐——tmux
使用过些linux终端,比如Tilda.Terminator. 之前最经常用的是Terminator,其可以上下左右分屏,比较方便,但其有个缺点是经常无故崩溃. 后来遇到Tmux,根据网上的设置配置了 ...
- My97DatePicker的calendar.js的反混淆
eval(string)函数 <script> eval(function(p, a, c, k, e, d) { p = 'function p(){console.log(" ...