求从1到n的数中,总共包含了多少个1
来源:互联网 发布:python 字典嵌套 list 编辑:程序博客网 时间:2024/05/15 09:29
首先容易想到的一种方法就是遍历这n个数,求出每个数中包含1的个数,然后加起来就ok了
- //从1 到 n的正数中1出现的次数
- #include <iostream>
- using namespace std;
- //求n中包含几个1
- int lmf(unsigned int n)
- {
- int sum=0;
- while(n)
- {
- if(n%10 == 1)
- {
- sum++;
- }
- n = n/10;
- }
- return sum;
- }
- int bxy(unsigned int n)
- {
- int sum = 0;
- for(unsigned int i=1; i <= n; ++i)
- {
- sum += lmf(i);
- }
- return sum;
- }
- void main()
- {
- cout << bxy(11) <<endl;
- }
但是这样做了好多无用功,试试对21345做个分析
首先把数字分为两部分:
1到1345
1346到21345
首先求从1346到21345
考虑最高位引入的1的个数,从10000到19999,一共10^4个,就是10的(length-1)次方。
由后四位引入的1的个数,计算如下:
2*10的3次方,
其中2指的是:万位上的两种选择0或者2
10的三次方指的是:后四位中有一位是1,其他三位从0到9十个数字任意选。
1到1345 使用递归求解。
程序如下:
- #include <iostream>
- using namespace std;
- int Pow10(unsigned int n)
- {
- int result = 1;
- for(unsigned int i=0; i<n; i++)
- {
- result *= 10;
- }
- return result;
- }
- int lmf(const char *strN)
- {
- if(!strN || *strN<'0' || *strN>'9' || *strN=='\0')
- {
- return 0;
- }
- int firstDigit = *strN-'0';
- unsigned int length = static_cast<unsigned int>(strlen(strN));
- //如果只有一位数,而且还是0,那就是0 了。。。
- if(length==1 && firstDigit==0)
- {
- return 0;
- }
- //如果只有一位数,但是大于0,那肯定包含一个1
- if(length==1 && firstDigit>0)
- {
- return 1;
- }
- //这里变量代表:10000到19999 这期间由于第一位引入的1的个数
- int numFirstDigit = 0;
- //如果最高位不是1,例如:23415,则由最高位引入的1的个数就是从10000到19999:也就是10^(5-1)
- if(firstDigit>1)
- {
- numFirstDigit = Pow10(length-1);
- }
- //如果第一位是1,例如12345.则由于第一位而引入的 1的个数就是从10000到12345,一共2346
- if(firstDigit == 1)
- {
- numFirstDigit = atoi(strN+1)+1;
- }
- //这个变量计算的是:由01346到21345除了第一位剩下其他为所引入的1的个数,
- //也就是说第一位只能取0或者2------firstDigit
- //剩下的四位中选出一位是1,即4种选法----------length-1
- //剩下的三位可以自由选择------------10^(length-2)
- //所以计算如下:
- int numOtherDigit = firstDigit * (length-1) * Pow10(length-2);
- //剩下的数字也就是从1到1345,递归调用此函数
- int numRecursive = lmf(strN+1);
- //返回三部分的和
- return numFirstDigit+ numOtherDigit +numRecursive;
- }
- int bxy(int n)
- {
- if(n <= 0)
- {
- return 0;
- }
- char strN[50];
- sprintf(strN,"%d",n);
- return lmf(strN);
- }
- void main()
- {
- cout << bxy(20) <<endl;
- }
0 0
- 【100题】求从1到n的数中,总共包含了多少个1
- 求从1到n的数中,总共包含了多少个1
- 对于一个数字,我们可以直观的了解到它所含有的数字,例如: 3243中包含1个2、2个3、1个4。 那么,给你一个数n,求从1到n之间的所有这些数字中,总共包含多少个m。
- 从1到n的数中总共包含1的个数
- 从1到1000中多少个包含3的数
- 求从0到n一共有多少个1
- 求一个数包含多少个1
- 在10进制和2进制中,从0到N总共包含1的数目
- 从N到M中出现多少个1
- 从1数到n,1出现多少次,有多少个1的问题,想了好长时间,才写出这个。算的速度还是可以的
- 求1到N个数中包含质因子m的数的个数
- 计算整型数的二进制中包含多少个1
- 求(1~n)中有多少个数字包含49数字
- 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。(google面试题) 例如 输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 分析
- 从1到n个自然数中,各个数位包含1的个数
- 1.2 从0到n,共包含多少个2?
- 从0开始到某个数N有点多少个1
- 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 //求总共有多少总跳法,并分析算法的时间复杂度
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
- 【Maven】-安装和配置
- Swift 性能探索和优化分析
- android graphic(19)—why Android's UI was designed the way it is and how it actually works
- OTL 简介
- 求从1到n的数中,总共包含了多少个1
- Java NIO系列教程(六) Selector
- android listview 含有edittext 数据错乱问题
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算
- C# 多线程
- LokiJS:性能优先的 JavaScript 内存数据库
- Android学习系列(39)--Android主题和样式之系统篇(上)
- 【JAVA】利用反射调用不同方法,减少重复代码
- 强大的jQuery移动插件Top 10