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



从1到n整数中1出现的次数:O(logn)算法

1. 题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。2. 题目来源第一次看到是在《剑指...
  • yi_Afly
  • yi_Afly
  • 2016年07月26日 13:13
  • 6565

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

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

输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数。

题目: 输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数。 例如输入12,从1 到12 这些整数中包含1 的数字有1,10,11 和12,1 一共出现了5 次。 注:这是一...
  • luyuncsd123
  • luyuncsd123
  • 2014年07月19日 01:45
  • 1867

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

计算1至n中整数k(包括0)出现的总次数
  • lxhpkm01
  • lxhpkm01
  • 2016年12月19日 15:02
  • 212

1到n的正整数x出现的次数

【题目】输入一个整数n,求从1到n这n个正数中,x出现的次数。x是1,2,...,9中任意一个。 例如:输入12,x=1,出现一的数字有1,10,11,12共有5个1,则输出5。 输入12,x=2...
  • penngrove
  • penngrove
  • 2012年12月02日 18:37
  • 1554

编程算法 - 从1到n整数中1出现的次数 代码(C)

从1到n整数中1出现的次数 代码(C)本文地址: http://blog.csdn.net/caroline_wendy题目: 输入一个整数n, 求从1到n这n个整数的十进制表示中1出现的次数.把拆分...
  • u012515223
  • u012515223
  • 2014年06月30日 22:57
  • 1915

【剑指Offer学习】【面试题32:求从1到n的整数中1出现的次数】

题目:输入一个整数n求从1 到n这n个整数的十进制表示中1 出现的次数。举例说明:例如输入12 ,从1 到12 这些整数中包含1 的数字有1、10、11 和12,1 一共出现了5 次。 题解思路: 一...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月04日 07:58
  • 2652

剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)

问题描述: 输入一个整数n,求1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,12,1一共出现了5次。 思路:(不考虑时间效率的解法,肯...
  • lilianforever
  • lilianforever
  • 2016年07月08日 17:10
  • 1115

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

题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1、10、11和12、1一共出现5次。 解法1: package BitCount...
  • qq_27291877
  • qq_27291877
  • 2015年07月26日 22:10
  • 217

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

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。分析: 方法1:不考虑时间效率的解法,通过对10求余判断个位数是否是1,若大于10就除以10之后再求余.方法2:将这n个数转换成...
  • hutongling
  • hutongling
  • 2017年03月28日 10:17
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从1到n整数中1出现的次数
举报原因:
原因补充:

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