可憎的数字

可憎的数字

如果一个数字在其二进制展开中有奇数个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日 21:09:06

相关推荐

  • 上外边距未生效

    标题:探究margintop失效的原因及解决方法 导言:在进行网页设计或者开发过程中,经常会遇到某些元素的margintop属性失效的情况,造成布局上的问题。本文将探究margintop失效的原因,并提供解决该问题的具体代码示例。 一、margintop属性失效的可能原因 盒模型问题:当元素的盒模型…

    2025年12月24日
    000
  • 深度剖析程序设计中必不可少的数据类型分类

    【深入解析基本数据类型:掌握编程中必备的数据分类】 在计算机编程中,数据是最为基础的元素之一。数据类型的选择对于编程语言的使用和程序的设计至关重要。在众多的数据类型中,基本数据类型是最基础、最常用的数据分类之一。通过深入解析基本数据类型,我们能够更好地掌握编程中必备的数据分类。 一、基本数据类型的定…

    2025年12月24日
    000
  • 利用CSS实现纯英文数字自动换行

    下面为大家带来一篇css代码使纯英文数字自动换行的简单实现。内容挺不错的,现在就分享给大家,也给大家做个参考。 当一个定义了宽度的块状元素中填充的全部为纯英文或者纯数字的时候,在IE和FF中都会撑大容器,不会自动换行 并且当数字或者英文中带有汉字时,会从汉字处换行,而纯汉字却可以自动换行。这个问题如…

    好文分享 2025年12月24日
    000
  • 生成的html代码怎么在记事本运行_记事本运行生成html代码方法【教程】

    服务器IP无法解析时,可通过记事本编写HTML文件并用浏览器运行来本地测试网页:一、用记事本输入HTML代码,另存为.html文件;二、双击文件或右键选择浏览器打开;三、右键用记事本修改代码并保存后,在浏览器刷新即可查看更新内容。 如果您尝试访问某个网站,但服务器无法访问,则可能是由于服务器 IP …

    2025年12月23日
    000
  • 代码保存为html文件后怎么运行_保存后html文件运行方法【教程】

    1、直接右键HTML文件选择浏览器打开即可本地运行;2、通过浏览器菜单使用Ctrl+O加载文件;3、用VS Code等编辑器配合Live Server插件实现热更新预览;4、对于含JS/CSS外链或异步请求的项目,需用npx http-server启动本地服务器,通过http://localhost…

    2025年12月23日
    000
  • 打完代码怎么让它运行html_完成代码后运行html步骤【指南】

    首先保存HTML文件为.html格式,如index.html;然后通过双击文件或右键用浏览器打开;也可在编辑器中使用Live Server等功能实时预览;最后可创建书签或快捷方式方便重复访问。 如果您已经编写完HTML代码,想要在浏览器中查看页面效果,需要按照正确的方式打开和运行该文件。以下是将编写…

    2025年12月23日
    000
  • html代码好了怎么不在浏览器运行_禁html在浏览器运行设置【设置】

    首先检查文件是否以.html为扩展名并正确命名,接着通过浏览器地址栏输入file:///路径访问文件,然后为浏览器快捷方式添加–allow-file-access-from-files参数以解除本地文件限制,最后确认代码包含DOCTYPE声明及完整标签结构并通过W3C校验工具检测语法正确…

    2025年12月23日
    000
  • Mac用CodeRunner一键运行HTML并弹出浏览器预览

    首先安装并配置CodeRunner,创建自定义HTML Preview语言类型,设置运行命令为open $filename且不启用终端运行,接着开启自动保存功能确保代码实时生效,最后通过系统快捷键设置将Run命令绑定到Cmd+R实现一键预览。 如果您在Mac上编写HTML代码,希望借助轻量级工具实现…

    2025年12月23日
    000
  • Linux用dmenu快速启动HTML相关学习应用

    首先配置dmenu并绑定快捷键,再编写Shell脚本集中管理HTML学习工具,最后通过脚本集成浏览器文档资源快捷入口,实现一键启动应用与网页。 如果您希望通过快捷键快速启动与HTML学习相关的应用程序,但每次都需要手动查找或输入命令,可以利用dmenu结合自定义脚本实现高效访问。以下是具体操作步骤:…

    2025年12月23日
    000
  • Mac Bear标签页同时打开HTML源码和CSS样式

    Bear不支持HTML与CSS标签页式编辑,仅能通过代码块编写并导出预览,建议搭配VS Code等专业工具实现双栏实时开发。 在 Mac 版的 Bear 笔记应用中,无法直接以标签页形式同时打开 HTML 源码和 CSS 样式进行编辑。Bear 是一款专注于简洁写作的 Markdown 笔记工具,它…

    2025年12月23日
    000
  • Mac终端用file命令快速检测HTML文件编码类型

    使用file命令可快速检测Mac上HTML文件的编码类型。打开终端,输入file -I yourfile.html,查看输出中的charset字段,如charset=utf-8表示UTF-8编码;结合ls、for循环与grep可批量处理并过滤显示多个.html文件的编码信息,提升检测效率。 如果您需…

    2025年12月23日
    000
  • 手机HTML网页编辑器入口 HTML编辑器手机在线免费

    手机HTML网页编辑器入口位于https://www.tutorialspoint.com/codingground,该平台支持多语言在线编码、实时预览、无需安装、适配移动端,提供语法高亮、示例模板、多标签编辑、文件导出与分享功能,兼容安卓和iOS系统,适合初学者学习与小型项目开发。 手机HTML网…

    2025年12月23日
    000
  • HTML id 属性唯一性:深入理解与最佳实践

    html `id` 属性在整个文档中必须保持唯一。虽然非唯一 `id` 可能不会立即导致页面崩溃,但它会引发浏览器警告,并严重影响 javascript 对元素的精确操作以及 css 样式的预期应用。本文将深入探讨 `id` 唯一性的重要性、非唯一 `id` 带来的潜在问题,并提供确保前端代码健壮性…

    2025年12月23日
    000
  • 如何嵌入图片html_HTML图片嵌入(img标签/背景图)方法

    使用img标签插入内容性图片,需设置src和alt属性;2. 使用CSS background-image添加装饰性背景图,便于控制样式;3. 正确使用相对或绝对路径确保图片加载;4. 根据语义合理选择方法以提升可访问性与性能。 在网页中显示图片,常用的方法有两种:使用 img 标签 直接插入图片,…

    2025年12月23日 好文分享
    000
  • HTML定义列表怎么用_HTML的dl dt dd标签使用教程

    HTML定义列表()用于表示术语与定义的语义化结构,由和标签组成,适用于名称-值对内容,如词汇表、FAQ等。它在语义上优于无序或有序列表,能提升可访问性和SEO。正确使用包括一个对应多个或多个共享一个,避免用作布局工具。通过CSS可实现垂直或水平布局,并借助Flexbox和媒体查询实现响应式设计,增…

    2025年12月22日
    000
  • 如何创建HTML中的无序列表

    无序列表在网页设计中用于提升内容可读性与信息架构,常用于导航菜单、产品特性、FAQ等场景,通过和标签构建,支持嵌套实现层级结构,并可用CSS自定义样式如符号类型、图片项目符及伪元素装饰,增强视觉表现与用户体验。 在HTML中创建无序列表其实非常直接,你只需要用到 (unordered list)和 …

    2025年12月22日
    000
  • 如何保持文本格式不变

    要保持文本格式不变,需根据需求选择合适格式:若需保留视觉与布局,使用PDF或.docx;若为纯文本或代码,应选用UTF-8编码的纯文本文件,并用专业编辑器处理,避免隐藏格式与乱码。 要保持文本格式不变,核心在于理解“不变”的语境是什么,以及你所处理的文本是“富文本”还是“纯文本”。通常,这意味着你需…

    2025年12月22日
    000
  • 如何设置链接无跳转

    设置链接无跳转可通过前端JavaScript阻止默认行为或后端重定向实现。前端使用event.preventDefault()阻止跳转,可在点击时执行自定义逻辑,如弹窗或异步请求,必要时通过window.location.href手动跳转。后端如Node.js Express可通过记录点击日志后再重…

    2025年12月22日
    000
  • HTML中如何实现度量单位

    HTML中实现度量单位的关键是正确使用CSS提供的绝对单位(如px、pt)和相对单位(如em、rem、vw、vh、%),根据场景选择合适单位以实现响应式设计和布局灵活性。 HTML中实现度量单位的关键在于正确使用CSS,它允许你指定元素的大小、间距和其他属性,并附带各种度量单位。理解这些单位及其适用…

    2025年12月22日
    000
  • HTML中如何实现电话输入框

    使用实现电话号码输入框,可提升移动端输入体验和语义化;通过pattern属性进行客户端格式验证,配合title提供友好提示;结合autocomplete、inputmode、JavaScript实时格式化与验证、清晰placeholder及无障碍设计,全方位优化用户体验。 在HTML中实现电话号码输…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信