十进制数1~n中1出现的次数

简介:

//copyright@ saturnman 
//updated@ 2011 July 
#include "stdafx.h" 
#include "string.h"
#include "stdlib.h"

int NumberOf1(const char* strN);
int PowerBase10(unsigned int n);

/////////////////////////////////////////////////////////////////////////////
// Find the number of 1 in an integer with radix 10
// Input: n - an integer
// Output: the number of 1 in n with radix
/////////////////////////////////////////////////////////////////////////////
int NumberOf1BeforeBetween1AndN_Solution2(int n)
{
if(n <= 0)
return 0;

// convert the integer into a string
char strN[50];
sprintf(strN, "%d", n);

return NumberOf1(strN);
}


/////////////////////////////////////////////////////////////////////////////
// Find the number of 1 in an integer with radix 10
// Input: strN - a string, which represents an integer
// Output: the number of 1 in n with radix
/////////////////////////////////////////////////////////////////////////////
int NumberOf1(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));

// the integer contains only one digit
if(length == 1 && firstDigit == 0)
return 0;

if(length == 1 && firstDigit > 0)
return 1;

// suppose the integer is 21345
// numFirstDigit is the number of 1 of 10000-19999 due to the first digit
int numFirstDigit = 0;
// numOtherDigits is the number of 1 01346-21345 due to all digits
// except the first one
int numOtherDigits = firstDigit * (length - 1) * PowerBase10(length - 2);
// numRecursive is the number of 1 of integer 1345
int numRecursive = NumberOf1(strN + 1);

// if the first digit is greater than 1, suppose in integer 21345
// number of 1 due to the first digit is 10^4. It's 10000-19999
if(firstDigit > 1)
numFirstDigit = PowerBase10(length - 1);

// if the first digit equals to 1, suppose in integer 12345
// number of 1 due to the first digit is 2346. It's 10000-12345
else if(firstDigit == 1)
numFirstDigit = atoi(strN + 1) + 1;

return numFirstDigit + numOtherDigits + numRecursive;
}

/////////////////////////////////////////////////////////////////////////////
// Calculate 10^n
/////////////////////////////////////////////////////////////////////////////
int PowerBase10(unsigned int n)
{
int result = 1;
for(unsigned int i = 0; i < n; ++ i)
result *= 10;

return result;
}
int num1Ofn(int n)
{
int count=0;
while(n>0)
{
if(n%10 == 1)
count++;
n/=10;
}
return count;
}
int count1Num(int n)
{
int sum=0;
for (int i =1;i <= n;i ++)
{
sum+=num1Ofn(i);
}
return sum;
}
int main()
{
printf("%d\n", count1Num(21345));
printf("%d\n", NumberOf1BeforeBetween1AndN_Solution2(21345));
return 0;
}

本文转自博客园知识天地的博客,原文链接:十进制数1~n中1出现的次数,如需转载请自行联系原博主。

相关文章
|
机器学习/深度学习 人工智能 自然语言处理
构建智能化编程环境:AI 与代码编辑器的融合
在人工智能的推动下,未来的代码编辑器将转变为智能化编程环境,具备智能代码补全、自动化错误检测与修复、个性化学习支持及自动化代码审查等功能。本文探讨了其核心功能、技术实现(包括机器学习、自然语言处理、深度学习及知识图谱)及应用场景,如辅助新手开发者、提升高级开发者效率和优化团队协作。随着AI技术进步,智能化编程环境将成为软件开发的重要趋势,变革开发者工作方式,提升效率,降低编程门槛,并推动行业创新。
|
存储 NoSQL Redis
Redis 为什么这么快?4 大核心设计图解!
本文详细解析了 Redis 的高性能设计,包括内存存储、单线程模型、IO多路复用技术和数据结构优化,帮助更好地理解和应用 Redis。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 为什么这么快?4 大核心设计图解!
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
415 0
|
存储 开发者 流计算
Github成就解锁指南详细讲解
Github在 2022 年推出了全新的成就勋章, 用于表彰有卓越开源贡献的开发者, 在日常使用 Github 的活动中可以解锁这些成就, 并在 Github 个人主页上展示,因此本文将快速介绍如何解锁 Github 成就勋章,截止目前,Github 共开放了 9 个成就, 后续还会推出更多成就!
1189 0
|
弹性计算 Ubuntu 数据安全/隐私保护
阿里云ECS云服务器使用体验与图形化界面搭建
体验阿里云服务器,使用WinSCP远程访问服务器,并搭载Ubuntu 20.04的图形化界面。
阿里云ECS云服务器使用体验与图形化界面搭建
|
数据安全/隐私保护 UED 索引
大文件上传和优化
最近项目里面有一些视频处理的功能,大概流程就是后端拿到文件以后,使用FFmpeg等底层命令进行去水印,裁切等功能,虽然现在是短视频的年代,但是依然会出现一些高分辨率,高时长的大文件视频,这时候因为一些原因,如网络等,失败率会陡增。
|
存储 数据可视化 数据管理
宜搭认证课程-业务流程设计(二)| 学习笔记
快速学习宜搭认证课程-业务流程设计。
宜搭认证课程-业务流程设计(二)| 学习笔记
|
Web App开发 Windows
Internet Download Manager2023永久授权版下载工具
Internet Download Manager 介绍 Internet Download Manager,全球最佳下载利器。Internet Download Manager (简称IDM) 是一款Windows 平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,具有站点抓取、批量下载队列、计划任务下载,自动识别文件名、静默下载、网盘下载支持等功能。一款下载器软件,也可以叫它网页嗅探下载工具可以理解为和迅雷差不多,但是没有迅雷那么多广告,而且功能也更加强大(ps:我也是不久前知道迅雷可以下载网页的视频了)。这是一款互联网下载管理器,看着名字挺长的
1534 0
|
运维 IDE 数据可视化
摆脱重复操作,你值得拥有的自动化工具Automa
摆脱重复操作,你值得拥有的自动化工具Automa
摆脱重复操作,你值得拥有的自动化工具Automa