从1到n整数中1出现的次数

原创 2015年07月09日 19:58:33

微笑解法一:


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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

剑指offer 32. 1到n整数中2出现的次数

//题目:从1到n个整数中输出2出现的次数 //解法1:同一每个数字中包含2的次数并相加 public class Main { public static void main(String[] ...

【剑指offer】计算1至n中整数k出现的次数

计算1至n中整数k(包括0)出现的总次数

统计在从1到n的正整数中1出现的次数

统计在从1到n的正整数中1出现的次数 1、最直观的想法,求1到n中每个整数中1出现的次数,然后相加即可。而求每个十进制整数中1出现的次数,我们先判断这个数的个位数是否是1,如果这个数大于10,除以1...

剑指offer面试题 32:从 1 到 n 整数中 1 出现的次数

题目:输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。 例如输入 12,这些整数中包含 1 的数字有 1,10,11,12, 1 一共出现了 5 次。 解题思路:...

从1到n整数中1出现的次数

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了...

剑指offer-5-面试32:从 1 到 n 整数中 1 出现的次数(时间效率)

题目 分析 不考虑时间效率的解法靠它想拿offer有点 难 从数字规律着手明显提高时间效率的解法能让面试官耳目一新 测试用例代码 本题考点 题目 从 1 到 n 整数中 1 出现的次数。题...

剑指offer-面试题32-从1到n整数中1出现的次数

解题思路参考自:http://blog.csdn.net/yi_afly/article/details/52012593 1. 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示...

剑指offer-面试题32.从1到n整数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次   本题可以直接变量1到n的n个数然后...

编程之美读书笔记---统计在从1到n的正整数中1出现的次数

问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1,...

面试题32:从1到n整数中1出现的次数

#include #include #include using namespace std; // 参考《剑指offer 面试题32:从1到n整数中1出现的次数 P174》 int ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)