计算从整数1到n之间,所有1的个数的和
来源:互联网 发布:知乎 修改一句话介绍 编辑:程序博客网 时间:2024/05/16 12:45
整数中1的个数(计算从整数1到n之间,所有1的个数的和)
C++代码
#include<iostream>using namespace std;int NumberOf1Between1AndN_Solution(int n){ int ones = 0; int a = 0; int b = 0; for (long long m = 1; m <= n; m *= 10) { a = n / m; b = n%m; ones += (a + 8) / 10 * m + (a % 10 == 1) * (b + 1); } return ones;}int main(){ int num; cin >> num; cout << NumberOf1Between1AndN_Solution(num)<<endl; return 0;}
通过使用一个 位置乘子m 遍历数字的位置, m 分别为1,10,100,1000…etc.
对于每个位置来说,把10进制数分成两个部分,比如说 当m=100的时候, 把十进制数 n=3141592 分成 a=31415 和 b=92 ,以此来分析百位数为1时所有数的个数和。m=100时,百位数的前缀为3141,当百位数大于1时,为3142*100,因为当百位数大于1时,前缀可以为0,即百位数可以从100到199,共100个数;当百位数不大于1时,为3141*100;如何判断百位数是否大于1?假设百位数为x,若(x+8)/10等于1,则大于1,若(x+8)/10等于0,则小于1。因此前缀可用(n/m + 8)/10 *m来计算(若计算2的个数,可以改为(n/m + 7)/10*m,若计算3的个数,改为(n/m + 6)/10*m,…以此类推)。
再例如m=1000时,n分为a=3141和 b=592;千位数的前缀为314,千位数不大于1,故前缀计算为314*1000;因为千位数为1,再加b+1(0到592)。即千位数为1的所有书的个数和为314*1000+592+1;公式(n/m + 8)/10*m + b +1。
注:只有n的m位为1时需要计算后缀,后缀计算为 (n/m%10==1)*(b+1),
即(n/m%10==1)判断第m位是否为1,若为1,则加上(b+1),若不为1,则只计算前缀。(若计算2的个数,可以改为(n/m%10==2)(b+1),若计算3的个数,可以改为(n/m%10==3)(b+1)…以此类推)
阅读全文
1 0
- 计算从整数1到n之间,所有1的个数的和
- 给定一个正整数N,从1到N所有整数,计算出现1的个数
- 给定一个十进制的整数,写下从1开始到N的所有整数,计算其中出现的所有"1"的个数
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
- 给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数
- 计算从1到n(包括n)之间出现的各位数字的个数
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数
- 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。
- 统计从1到N的所有整数中出现1的个数
- 1到n之间的所有整数的立方
- 给定一个十进制n,从1开始,到n的所有整数,求出现1的个数
- 使用C语言编写程序,计算N个整数的和(随机输入一个值,例如1到100之间所有整数的和)
- 从1到n整数中1出现的个数
- 输入两个整数值n和m,求出整数1到n之间的和为m的所有组合
- 输入两个整数值n和m,求出整数1到n之间的和为m的所有组合
- 输入两个整数值n和m,求出整数1到n之间的和为m的所有组合
- 计算1 到 N 之间 某个数字出现的个数
- 对于一个整数n,有一个函数f(n) 可以计算到1到n之间的出现“1“的个数。
- kubernetes1.5.2集群部署过程--安全模式
- Ericsson Ridea从入门到精通(三)
- Elasticsearch Reference 5.5 中文翻译4
- OGV格式转成MP4格式
- 泛型 List中的Sort方法
- 计算从整数1到n之间,所有1的个数的和
- qq空间h5页面,如何在微信中直接打开qq空间链接却不需要登陆qq账号密码
- python-3 元组
- c语言实现二叉树的建立与前序、中序、后序、层序遍历
- hdu 3172 Virtual Friends(加权并查集)
- map、list查询速度
- Maven详解(六)------ 生命周期
- 数值计算和SVM讲解(下)
- apache tomat安装