编程之美2.4——“1”的数目

2024-09-01 05:32
文章标签 2.4 编程 数目 之美

本文主要是介绍编程之美2.4——“1”的数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:给定一个正整数N,写出1到N(包含N)的所有正整数,然后数一下其中出现的所有N的个数。
举个例子,假设你输入的是11,则1到11的所有正整数为:
1,2,3,4,5,6,7,8,9,10,11
其中1出现了四次(1,10,11),请编写一个程序完成这个任务。
最暴力的解法这里不用说,因为如果面试的话肯定会死,微软的面试要是写出这种代码就能活下来也太容易了。
当我第一次看到这道题时,我先自己想了一下。不过没想出来,后来看了答案发现是我自己的思路有问题。我的思路是由最高位开始算,可解法偏偏是由最低位开始算。后来仔细想一下,从最低位开始算的这种思路实在是精妙。

问题分析

暴力循环不行,所以换个角度来看。可以把问题这样分解,从1到N的所有数字中,各位上有多少个1,十位上有多少个1,百位上有多个1.。。。。。。。
对于每一个位数字,可以分类讨论

1:该位数字大于1
2:该位数字等于1
3:该位数字等于0

之所以要分为3种情况,是因为“1”是一个特殊数字。

对于213。

如果十位数字是1,则十位上1的个数不仅和高位数字2有关,也和低位数字3有关——110-119,210-213
如果十位数字是2(大于1)即223,则此时十位上出现1的次数只与高位数字有关——110-119,210-219。
如果十位数字是0(小于1)即203,则此时十位上出现1的次数也只与高位数字有关——110-119
上述就是问题的关键

下面是一个简单的实现:

/*
get the number of 1
*/
#include <iostream>
#include <string>
using namespace std;
int calc(int n){auto count=0;int factor=1;int lowerNum=0;int currentNum=0;int highNum=0;while(n/factor!=0){lowerNum=n-(n/factor)*factor;currentNum=(n/factor)%10;highNum=n/(factor*10);switch(currentNum){case 0:count+=highNum*factor;break;case 1:count+=highNum*factor+lowerNum+1;break;case 2:count+=(highNum+1)*factor;break;}factor*=10;}return count;
}
int main(int argc,char **argv){int num=0;cout<<"cin num: "<<endl;cin>>num;int count=calc(num);cout<<count<<endl;return 0;
}

PS:这道题真是体现了编程的美,一个优秀的程序员就如一个设计师

以上

这篇关于编程之美2.4——“1”的数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126077

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。