从1到n整数中1出现的次数
来源:互联网 发布:java软件编程培训学校 编辑:程序博客网 时间:2024/04/30 14:42
解法一:
int NumberOf1Between1AndN(unsigned int n)
{
int number = 0;
for (unsigned int i = 1; i <= n; ++i)
number += NumberOf1(i);
return number;
}
int NumberOf1(unsigned int n)
{
int number = 0;
while (n)
{
if (n % 10 == 1)
number++;
n = n / 10;
}
return number;
}
从数字规律着手明显提高时间效率的解法
int NumberOf1Between1AndN(int n)
{
if (n <= 0)
return 0;
char strN[50];
sprintf(strN, "%d", n);
return NumberOf1(strN);
}
int NumberOf1(const char* strN)
{
if (!strN || *strN < '0' || *strN>'9' || *strN == '\0')
return 0;
int first = *strN - '0';
unsigned int length = static_cast<unsigned int>(strlen(strN));
if (length == 1 && first == 0)
return 0;
if (length == 1 && first > 0)
return 1;
//假设strN是21345
//numFirstDigit是数字10000~19999的第一个位中的数目
int numFirstDigit = 0;
if (first > 1)
numFirstDigit = PowerBase10(length - 1);
else if (first == 1)
numFirstDigit = atoi(strN + 1) + 1;////+1去除最高位, 再加1
//numbOtherDigits是1346~21345除了第一位之外的数位中的数目
int numOtherDigits = first*(length - 1)*PowerBase10(length - 2);//从length-1位中随机选者一位,剩余的length-2位为0~9的组合
//numRecursive 是1~1345中的数目
int numRecursive = NumberOf1(strN + 1);//去除最高位
return numFirstDigit + numOtherDigits + numRecursive;
}
int PowerBase10(unsigned int n)
{
int result = 1;
for (unsigned int i = 0; i < n; ++i)
result*= 10;
return result;
}
- 整数中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出现的次数
- 从1到n整数中1出现的次数
- 从1到 n整数中1出现的次数
- 从1到n整数中1出现的次数
- phonegap环境安装与配置
- 看看GNU编译器都生成了什么样的汇编代码
- TOJ 4115 Find the number
- Deep Learning(深度学习)学习笔记整理系列之(八)
- Ruby Style Guide。
- 从1到n整数中1出现的次数
- C++类型转换
- CUDA2.4-原理之性能优化及浮点运算
- Mini-batch gradient
- 使用MyBatis Generator自动创建代码
- 创建圆形头像和圆角图片
- C++ 语句,表达式的区别
- JBoss vs. Tomcat
- 《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象