可憎的数字

可憎的数字

如果一个数字在其二进制展开中有奇数个1,则被认为是奇异数。前10个奇异数是1,2,4,7,10,11,13,14,16,19,21。有趣的是,所有2的幂都是奇异数,因为它们只有1个位被设置。

下面的文章详细讨论了两种判断一个数字是否为可恶数字的方法。

问题陈述

这个问题的目的是检查给定的数字是否是一个可恶的数字,即它是一个在其二进制展开中具有奇数个设置位的正数。

令人厌恶的数字示例

Input: 34
Output: Non-Odious Number

说明

34的二进制表示是10010。

设置位数 = 2。

由于1的数量是偶数,34不是一个可怕的数字。

Input: 1024
Output: Odious Number

说明

1024的二进制表示为10000000000。

设置位数 = 1。

由于1024是2的幂,所以只有1个设置位。因此它是一个可怕的数字。

Input: 53
Output: Non-Odious Number

说明

(53)10 = (110101)2

设置位数 = 4。

因此,它不是一个可憎的数字。

解决方案

为了判断一个数是否是可恶的,我们必须知道设置的位数是奇数还是偶数。这里的主要任务是统计数字的二进制展开中设置的位数。可以采用以下技术来计算位数,然后检查结果是奇数还是偶数。

Naive Approach

的中文翻译为:

天真的方法

使用循环和右移运算符逐一遍历数字的所有位。

如果位值为1,则将计数增加一。

检查 count 的最终值是奇数还是偶数。

显示答案。

伪代码

函数 no_of_set_bits()

初始化计数 = 0

当 (n > 0)

if ((n & 1) > 0)   Increment countRight Shift n

返回计数

函数 is_odious()

如果 (count 是奇数)

返回真

其他

返回错误

函数main()

初始化 n

函数调用 no_of_set_bits()

调用函数 is_odious()

打印输出

示例:C++ 程序

该程序检查一个数字是否令人厌恶。它通过在函数 no_of_set_bits() 中每次迭代结束时右移 n 的值来检查循环每次迭代中最右边的位。

#includeusing namespace std;// this function counts the number of set bits by analyzing the rightmost bit using a while loop till n > 0.// it performs logical & operation between 1 and n to determine if the rightmost bit is set or not.// if it is set, count is incremented by 1// right shift the value of n to make the bit left of the rightmost bit, the new rightmost bit.int no_of_set_bits(int n){   int count = 0;   while (n > 0){         // if the rightmost bit is 1: increment count      if ((n & 1) > 0){         count++;      }            // right shift the value of n to examine the next bit      n = n >> 1;   }   return count;}// this function determines if count of set bits is odd or even// odd -> odiousbool is_odious(int count){   // if count is odd return true   if (count % 2 != 0){      return true;   }   return false;}// main functionint main(){   int n = 27;   int countBits = no_of_set_bits(n);   if (is_odious(countBits)){      cout << n << " is Odious Number";   }   else {      cout << n << " is Non-Odious Number";   }   return 0;}

输出

27 is Non-Odious Number

时间和空间的分析

时间复杂度:O(log(n)),因为 n 的二进制展开需要 log2n 位,我们检查所有位以检查设置的位。

空间复杂度:O(1),因为没有使用额外的空间。

Brian Kernighan 的算法方法

该算法可用于以更有效的方式计算数字的设置位数。然后可以使用函数 is_odious() 来确定该数字是否令人厌恶。

这种方法的基本原理是重复清除数字最右边的设置位,同时跟踪需要多少次迭代才能达到零。涉及的步骤是 –

将计数初始化为0

当数字大于零时,在数字与其 2 的补码之间执行按位 & 以取消设置最右边的设置位。

每次循环迭代都会增加计数。

检查最终计数是否为奇数。

显示结果。

示例

设数字为10。10的二进制展开为1010。可以观察到它有2个设置位。

循环迭代 1 –

n = 10n & (n-1) =  10 & 91010   (n)1001   (n - 1)1000   (n = 8)

循环迭代 2 –

n = 8n & (n-1) = 8 & 71000    (n)0111(n-1)0       (n = 0) 

迭代次数 = 设置位数 = 2。

伪代码

函数 no_of_set_bits()

初始化计数 = 0

当 (n > 0)

n = n & (n-1)

增加计数

返回计数

函数 is_odious()

与之前的方法相同

函数main()

与之前的方法相同

示例:C++ 程序

这个程序通过计算需要取消所有设置位所需的迭代次数来计算设置位的数量。为了取消位,我们对n和n-1执行位与操作。这是因为n-1的二进制表示会翻转n的最右边的设置位以及其后面的所有位。

#includeusing namespace std;// this function counts the number of set bits by unsetting the rightmost set bit using a while loop till n > 0.// it performs logical & operation between n and n - 1 to unset the rightmost set bit.// count is incremented in every iterationint no_of_set_bits(int n){   int count = 0;   while (n > 0){      // update the value of n to unset the current rightmost set bit      n = n & (n - 1);      count++;   }   return count;}// this function determines if count of set bits is odd or even// odd -> odiousbool is_odious(int count){   // if count is odd return true   if (count % 2 != 0){      return true;   }   return false;}// main functionint main(){   int n = 27;   int countBits = no_of_set_bits(n); // function call   if (is_odious(countBits)){      cout << n << " is Odious Number";   }   else {      cout << n << " is Non-Odious Number";   }   return 0;}

输出

27 is Non-Odious Number

时空分析

时间复杂度 – O(log(x)),其中 x 是数字中设置的位数。如果只有 1 个设置位,则循环将运行一次。

空间复杂度 – O(1),因为没有使用额外的空间。

比较上述方法

虽然第一种方法相当容易理解,但需要 log(n) 次迭代才能产生最终结果。另一方面,第二种方法采用 log(x) 迭代,其中 x 是数字的二进制展开中设置的位数。因此,它提高了性能。

结论

本文讨论了两种检查数字是否令人厌恶的方法。它还为我们提供了该方法的概念、示例、使用的算法、C++程序解决方案以及每种方法的复杂性分析。它还对两种方法进行了比较,以确定哪种方法更有效。

以上就是可憎的数字的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:08:33
下一篇 2025年12月17日 02:38:57

相关推荐

  • 用C++将一个数字表示为最大可能数量的质数之和

    讨论一个问题,例如,给定一个数字 N,我们需要将该数字拆分为最大素数和 Input: N = 7Output: 2 2 3Explanation: 7 can be represented as the sum of two 2’s and a 3 which are the maxim…

    2025年12月17日
    000
  • 使用C++编写代码,找到第N个非平方数

    我们都知道不是任何数字的平方的数字,如 2、3、5、7、8 等。非平方数有 N 个,不可能知道每个数字。因此,在本文中,我们将解释有关无平方数或非平方数的所有内容,以及在 C++ 中查找第 N 个非平方数的方法。 第 N 个非平方数 如果一个数是整数的平方,则该数被称为完全平方数。完全平方数的一些例…

    2025年12月17日
    000
  • C++程序:找到具有相同左右旋转的数字的最长子序列

    在这个问题中,我们需要找到左右旋转相同的子序列的最大长度。左旋转是指将字符串中的所有字符向左移动,并将末尾的第一个字符移动。右旋转意味着将所有字符串字符向右移动,并将最后一个字符移动到开头。 问题陈述 – 我们给定了包含数字的字符串str,需要找到左右旋转相同的最大长度的子序列。 示例 输入-str…

    2025年12月17日
    000
  • 将一个以链表表示的数字加1

    数字的链表表示是这样提供的:链表的所有节点都被视为数字的一位数字。节点存储数字,使得链表的第一个元素保存数字的最高有效位,链表的最后一个元素保存数字的最低有效位。例如,数字 202345 在链表中表示为 (2->0->2->3->4->5)。 要向这个表示数字的链表添加…

    2025年12月17日
    000
  • 检查是否可能从原点到达给定圆的周长上的任意点

    圆的周长可以定义为圆的外边界。它是圆的周长。圆周围的每个点都遵循某些属性,如下所示 – 点 (x,y) 位于圆内,使得 $mathrm{x^2 + y^2 点 (x,y) 位于圆上,使得 $mathrm{x^2 + y^2 = R^2}$ 点 (x,y) 位于圆外,使得 $mathrm{…

    2025年12月17日
    000
  • 使用C++编写一个找到数字的程序,其数字的各位数之和为偶数的程序

    能被2整除的整数是偶数。因此在本文中,我们给定了一个数n,我们需要找到第n个数字,其数字之和为偶数。前五个数字的数字之和为偶数的数分别是2、4、6、8和11。例如 − Input : n = 5Output : 11Explanation : First 5 numbers with even su…

    2025年12月17日
    000
  • 检查一个数字是否为回文的Bash程序?

    要检查一个数字是否是回文数,我们需要将该数字反转,然后如果原始数字和反转后的数字相同,则为回文数。在Bash中,执行反转操作非常简单。我们需要使用‘rev’命令来实现。让我们看一下程序以更清楚地理解。 示例 #!/bin/bash# GNU bash Scriptn=12321rev=$(echo …

    2025年12月17日
    000
  • 将数组表示的数字加1(递归方法)

    给定一个数组,该数组是由非负数字表示的数字的集合,将数字加1(增加由数字表示的数字)。数字存储方式是最高位数字是数组的第一个元素。 要将数字加1到由数字表示的数字 从数组末尾开始,加法意味着将最后一个数字4舍入为5。 如果最后一个元素是9,则将其变为0并进位=1。 对于下一次迭代,检查进位,如果加到…

    2025年12月17日
    000
  • 在C和C++中的未定义行为

    在这里,我们将看到一些C和C++代码,并尝试猜测结果。这些代码将生成一些运行时错误。 1. 除以零的错误是未定义的。 示例代码 #include using namespace std;int main() { int x = 10, y = 0; int z = x / y; cout <&…

    2025年12月17日
    000
  • 打印N行数字,使得每对数字之间的最大公约数为K

    gcd gcd代表两个或多个整数的最大公约数,不包括0 例如,要找到48和180的最大公约数 48 = 2 × 2 × 2 × 2 × 3 180 = 2 × 2 × 3 × 3 × 5 最大公约数 = 2 × 2 × 3 = 12。 在给定的问题中,应打印N行,其中元素具有指定的最大公约数 Inp…

    2025年12月17日
    000
  • C语言中的数组

    数组是连续内存位置上相同类型元素的集合。最低地址对应于第一个元素,最高地址对应于最后一个元素。 数组索引以零 (0) 开始,以数组大小减一(数组大小 – 1)结束。数组大小必须是大于零的整数。 让我们看一个例子, If array size = 10First index of arra…

    2025年12月17日
    000
  • 在C语言中,不使用循环、递归和宏展开的情况下,打印一个数字100次

    在本节中,我们将看到如何在C语言中打印一个数字100次。有一些限制条件。我们不能使用循环、递归或宏展开。 为了解决这个问题,我们将使用C语言中的setjump和longjump。setjump()和longjump()位于setjmp.h库中。这两个函数的语法如下所示。 示例 #include #i…

    2025年12月17日
    000
  • C程序以X形式显示数字

    参考下面的算法,编写C程序以显示X形状的数字。 算法 Step 1: StartStep 2: Declare variablesStep 3: Read number of rowsStep 4: for loop satisfiesif(i==j || i+j==rows-1)print i+1…

    2025年12月17日
    000
  • C++程序以找到使数字为0所需的最少操作次数

    假设我们有一个包含 n 位数字的数字字符串 S。假设 S 代表一个数字时钟,整个字符串显示从 0 到 10^n – 1 的整数。如果位数较少,则会显示前导 0。按照以下操作 – 将时钟上的数字减 1,或 交换两位数字 p> 我们希望时钟能够以最少的操作次数显示 0。我们…

    2025年12月17日
    000
  • .NET控制台应用程序开发:不仅仅是“Hello World”

    现代.NET控制台程序可处理文件、调用API、读取配置、执行定时任务,支持命令行参数解析、配置文件管理、日志记录与外部服务调用,结合合理结构可成为高效工具。 很多人接触 .NET 的第一行代码都是从控制台程序的 “Hello World” 开始的。这确实是个不错的起点,但如果…

    2025年12月17日
    000
  • .NET怎么在程序中执行一个外部exe文件

    使用System.Diagnostics.Process类可执行外部exe文件,通过Process.Start启动进程,支持简单调用和ProcessStartInfo配置参数、工作目录、窗口行为及输出重定向,需注意路径、权限和异常处理。 在 .NET 程序中执行外部 exe 文件,最常用的方式是使用…

    2025年12月17日
    000
  • .NET怎么将一个整数转换为十六进制字符串

    在.NET中,使用ToString(“X”)可将整数转为大写十六进制字符串,如255转为”FF”;用ToString(“x”)则转为小写,如”ff”;可通过拼接添加”0x”前缀,如…

    2025年12月17日
    000
  • .NET怎么通过反射获取对象的属性和方法

    答案:在.NET中,通过反射可动态获取类型信息并操作对象成员。使用GetType()或typeof()获取Type对象,调用GetProperties()遍历属性并用GetValue/SetValue读写值,通过GetMethods()获取方法并用Invoke执行,支持参数传递;需注意性能开销及默认…

    2025年12月17日
    000
  • .NET Web API如何使用Swagger生成API文档

    在 .NET Web API 中集成 Swagger 可自动生成可交互的 API 文档。首先通过 NuGet 安装 Swashbuckle.AspNetCore 包,然后在 Program.cs 中添加 AddEndpointsApiExplorer() 和 AddSwaggerGen() 服务,并…

    2025年12月17日
    000
  • .NET的AssemblyFileVersionAttribute类的作用是什么?

    AssemblyFileVersionAttribute用于指定程序集的文件版本,主要在文件系统中显示,不影响运行时;而AssemblyVersionAttribute定义程序集的逻辑版本,影响运行时加载和绑定,二者可独立设置,常用于区分发布版本与内部构建。 AssemblyFileVersionA…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信