整数中1出现的次数(从1到n整数中1出现的次数)
来源:互联网 发布:程序员三强 编辑:程序博客网 时间:2024/06/06 08:40
本题可分为两道题,如下:
题目描述:求出1~n的整数中1出现的次数,例如1~13中包含1的数字有1、10、11、12、13。此时如果按照1出现的次数,那么将会有6次。如果是含有1的数字的个数,则为5个。下面将分别按照不同的方式来给出代码。
1. 1~13中含有1的数字为5个
int NumberOf1Between1AndN_Solution1(int n){ int bit = -1; int n_copy = n; int maxbitNum = 0; while (n_copy) { maxbitNum = n_copy % 10; n_copy = n_copy / 10; bit++; } //按照首字母为1和非1大来分,非1便是在2-9之间。具体思路就是如果是1-999之间的数字,那么十位百位分位取值只要含有1就可以,也就转化为所有数组组合减去所有数字都不含有1的组合,即10*10*10-9*9*9。 if (maxbitNum > 1) { return maxbitNum * pow(10, bit) - (maxbitNum - 1) * pow(9, bit) + NumberOf1Between1AndN_Solution1(n - maxbitNum * pow(10, bit)); } else { return pow(10, bit) - pow(9, bit) + n - maxbitNum * pow(10, bit) + 1; }}
2. 1~13中含有1的个数为6个,即11算含有两个1
int NumberOf1Between1AndN_Solution(int n){ if (n < 10 && n > 0) { return 1; } else if (n <= 0) { return 0; } else { int bit = -1; int n_copy = n; int maxbitNum = 0; while (n_copy) { maxbitNum = n_copy % 10; n_copy = n_copy / 10; bit++; } //大致思路相同,但是做法不同。直接找含有1的数字,而且含有1的个数多的数字要算较多遍。 if (maxbitNum > 1) { return pow(10, bit) + maxbitNum * bit * pow(10, bit - 1) + NumberOf1Between1AndN_Solution(n - maxbitNum * pow(10, bit)); } else { return bit * pow(10, bit - 1) + n - maxbitNum * pow(10, bit) + 1 + NumberOf1Between1AndN_Solution(n - maxbitNum * pow(10, bit)); } } }
阅读全文
0 0
- 整数中1出现的次数(从1到n整数中1出现的次数)
- 整数中1出现的次数(从1到n中出现的次数)
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到n整数中1出现的次数
- 从1到 n整数中1出现的次数
- 315. Count of Smaller Numbers After Self
- .NET研发人员面试题(一)
- webapi 带参数上传图片
- 接口,继承的意义和使用方法
- ros:(2)ros节点
- 整数中1出现的次数(从1到n整数中1出现的次数)
- HTTP的长连接和短连接
- Java 学习内容
- Centos 7 Nginx安装与防火墙的配置
- 第4周项目5- 循环双链表应用
- Java使用Collections.sort进行组合分类排序
- c/c++解奇次线形方程组
- gazebo 第一节
- ngrok免费内网穿透