C++求1到n中1出现的次数以及数的二进制表示中1的个数

C++求1到n中1出现的次数

题目描述

给定一个整数 n,求出从 1 到 n 中数字 1 出现的次数。

示例 1

输入: n = 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13。

实现思路

本题需要一些数学知识和代码技巧。我们可以分三个部分来考虑:

  1. 设定一个变量 count,用来记录数字 1 出现的次数。
  2. 对于从 1 到 n 的每一个数字,我们需要计算它二进制表示中 1 的个数。具体算法是利用位运算 & 得到一个数的各位值,与值 1 相事实,如果结果是 1,则说明原来的数二进制表示中该位为 1,否则为 0
  3. 累加每个数字二进制表示中 1 的个数,最后就得到了从 1 到 n 中数字 1 出现的次数。

代码实现

以下是 C++ 代码的实现,具体注释已在代码中给出。

class Solution {
public:
    int countDigitOne(int n) {
        int count = 0;
        long long factor = 1;
        int h, l, cur;  // h 为当前处理数位的高位,l 为当前处理数位的低位,cur 为当前处理的数位的值
        while (n / factor != 0) {
            h = n / (factor * 10);
            cur = (n / factor) % 10;  // 当前处理的数位
            l = n - (n / factor) * factor;  // 获取当前处理数位的低位值
            if (cur == 0) {
                count += h * factor;  // 在当前位为 0 时,计算数字 1 出现的次数
            } else if (cur == 1) {
                count += h * factor + l + 1;  // 在当前为为 1 时,计算数字 1 出现的次数
            } else {
                count += (h + 1) * factor;  // 在当前位大于 1 时,计算数字 1 出现的次数
            }
            factor = factor * 10;  // 更新处理的数位
        }
        return count;
    }
};

以上代码的时间复杂度为 $O(\log n)$。

数的二进制表示中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

示例 1

输入: 11
输出: 3
解释: 数字 11 的二进制为 1011,其中有三个 1。

实现思路

对于一个二进制数,如果该数的二进制表示中有 $k$ 个 1,则该数字与数字 $2^{k-1}$ 做与运算后的结果为 0。这是因为 $2^{k-1}$ 的二进制表示中只有一个 1,这个 1 对应到与它相交运算的另一个数的二进制表示中也只会有一个 1。

因此,我们可以利用这个方法来计算一个数的二进制表示中 1 的个数。具体实现思路是,从低位到高位依次判断每一位是否为 1,如果是则计数器加 1,同时将该数与当前所在的位数对应的 $2^n$ 值做与运算,判断是否等于 0,如果相等则结束循环。

代码实现

以下是 C++ 代码的实现,具体注释已在代码中给出。

class Solution {
public:
    int numberOf1(int n) {
        int count = 0;
        unsigned int flag = 1;  // 初始值是 1
        while (flag != 0) {
            if ((n & flag) != 0) {  // 判断当前位是否为 1
                count++;
            }
            flag = flag << 1;  // 更新对应的 $2^n$ 值 
        }
        return count;
    }
};

以上代码的时间复杂度为 $O(\log n)$。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++求1到n中1出现的次数以及数的二进制表示中1的个数 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言中static和auto用法详解

    C语言中的static和auto用法详解 在C语言中,我们可以使用static和auto关键字来定义变量。这两种关键字的使用场景是不同的,下面我们将分别进行详细讲解。 auto关键字 auto关键字可以用来定义函数内的局部变量,通过使用auto关键字,编译器会在编译时自动为变量分配存储空间。 下面是一个使用auto关键字的示例: #include<st…

    C 2023年5月24日
    00
  • Json格式详解

    Json格式详解 什么是Json? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,并易于机器解析和生成。它基于JavaScript语言的一个子集。JSON采用键值对的方式来描述信息,通过大括号{}包围对象,通过方括号[]包围数组。 Json格式规则 数据在名称/值对中 数据由逗号分隔 大括号{}包…

    C 2023年5月23日
    00
  • 使用C语言打印月历

    使用C语言打印月历需要进行如下步骤: 第一步:确定需求 我们需要编写一个程序,根据用户输入的年份和月份,输出该月份的日历。用户输入的年份和月份需要通过命令行参数传递。 第二步:分析问题 要输出一个月份的日历,我们需要知道这个月有多少天,以及从哪一天开始。根据该月第一天是星期几,我们可以推算出每天在日历中的位置。因此,我们需要解决以下问题: 根据年份和月份计算…

    C 2023年5月23日
    00
  • 解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢

    针对“解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢”的问题,可以按照以下步骤进行: 1. 确认问题 首先要确认svchost.exe的CPU占用率过高是否是系统缓慢的主要原因。可以打开任务管理器(快捷键Ctrl+Shift+Esc),在进程标签页中找到svchost.exe进程,将其展开,查看对应的服务列表。如果某个服务的CPU占用过高…

    C 2023年5月22日
    00
  • C语言编程中常见的五种错误及对应解决方案

    C语言编程中常见的五种错误及对应解决方案 C语言作为一门古老而广泛应用的编程语言,因为其高效、灵活、强大的特性受到了广泛的关注和使用。但是,在编写C程序时,常常会遇到各种错误,本文将介绍C语言编程中常见的五种错误及对应的解决方案,以帮助读者更好地避免这些错误并提高编程能力。 1. 语法错误(Syntax Error) 语法错误指在编译程序时发生的错误,通常是…

    C 2023年5月23日
    00
  • C语言实现扫雷小项目

    C语言实现扫雷小项目攻略 1. 确定游戏功能和数据结构 在开始编码前,首先需要确定扫雷游戏的基本功能和数据结构: 游戏功能:实现扫雷游戏的核心功能,包括地雷的生成、数字的计算、点击和标记等操作。 数据结构:定义并实现游戏所需的数据结构,如二维数组等。 2. 创建扫雷项目文件 创建一个新的C语言项目文件夹并进入该文件夹,输入以下命令: mkdir minesw…

    C 2023年5月23日
    00
  • C++中的vector中erase用法实例代码

    C++中的vector中erase用法实例代码 简介 在C++中,vector是一种非常常用的容器,它可以动态地管理内存,能够随时加入或者删除元素。vector的erase方法是其中非常常用的函数之一,通过该函数我们可以删除vector中的元素。 使用方法 vector中的erase函数有多种使用方法,其中比较常用的有两种,分别是通过迭代器和通过下标。下面将…

    C 2023年5月23日
    00
  • 剖析C语言关键字之void,const,return

    剖析C语言关键字之void 概述 void 是 C 语言中表示“无类型”的关键字。它通常用于函数声明,表示该函数不返回任何值。 函数声明 使用 void 关键字的函数声明可以没有参数也可以有一个或多个参数,但是不会返回任何值。例如: void myFunction(void); void myFunctionWithParams(int a, float b…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部