目錄
問題陳述
令人厭惡的數字範例
說明
解決方案
Naive Approach
天真的方法
虛擬程式碼
範例:C 程式
輸出
時間與空間的分析
Brian Kernighan 的演算法方法
範例
時空分析
比較上述方法
結論
首頁 後端開發 C++ 可憎的數字

可憎的數字

Aug 31, 2023 pm 07:41 PM
程式設計 數位 可憎

可憎的數字

如果一個數字在其二進位展開式中有奇數個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 count
Right Shift n
登入後複製
  • 返回計數

函數 is_odious()

  • 如果 (count 是奇數)

    • 返回真

  • 其他

    • 回傳錯誤

函數main()

  • 初始化 n

  • 函數呼叫 no_of_set_bits()

  • #呼叫函數 is_odious()

  • 列印輸出

範例:C 程式

該程式檢查一個數字是否令人厭惡。它透過在函數 no_of_set_bits() 中每次迭代結束時右移 n 的值來檢查循環每次迭代中最右邊的位元。

#include<iostream>
using 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 -> odious
bool is_odious(int count){

   // if count is odd return true
   if (count % 2 != 0){
      return true;
   }
   return false;
}

// main function
int 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 = 10
n & (n-1) =  10 & 9
1010   (n)
1001   (n - 1)
1000   (n = 8)
登入後複製

循環迭代 2 -

#
n = 8
n & (n-1) = 8 & 7
1000    (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的最右邊的設定位以及其後面的所有位。

#include<iostream>
using 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 iteration
int 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 -> odious
bool is_odious(int count){

   // if count is odd return true
   if (count % 2 != 0){
      return true;
   }
   return false;
}

// main function
int 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 程式解決方案以及每種方法的複雜性分析。它還對兩種方法進行了比較,以確定哪種方法更有效。

以上是可憎的數字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

真我 GT Neo6 定檔 5 月 9 日!機圈首場 AI 數位人發表會 真我 GT Neo6 定檔 5 月 9 日!機圈首場 AI 數位人發表會 May 08, 2024 pm 12:49 PM

5月7日,我手機廠商正式宣布,本公司GTNeo6發表會定檔5月9日。我GTNoe6被定位為"性能風暴",旨在攪動中端機風雲。除此之外,該發表會也將是手機圈首場AI數位人發表會。屆時,真我realme副總裁、全球行銷總裁、中國區總裁徐起將以數位人的形式出現在發表會上。數位人徐起根據官方介紹,真我GTNoe6代號為"颶風",更快更強,將挑戰最強第三代驍龍8s旗艦,挑戰同檔最強產品力。日前,真我GTNeo6被發現直接在電商平台上架,部分核心配置曝光,顯示該機不僅搭載了驍龍8s處理器,還支援120W閃充

使用 Python 解決問題:作為初學者,解鎖強大的解決方案 使用 Python 解決問題:作為初學者,解鎖強大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學者能夠解決問題。

C++ 程式設計謎題片段:激發思維,提升程式設計水平 C++ 程式設計謎題片段:激發思維,提升程式設計水平 Jun 01, 2024 pm 10:26 PM

C++程式設計謎題涵蓋斐波那契數列、階乘、漢明距離、陣列最大值和最小值等演算法和資料結構概念,透過解決這些謎題,可以鞏固C++知識,提升演算法理解和程式設計技巧。

釋放你內心的程式設計師:C 絕對初學者 釋放你內心的程式設計師:C 絕對初學者 Oct 11, 2024 pm 03:50 PM

C語言是初學者學習程式設計的理想選擇,其優點包括效率、多功能性和可移植性。學習C語言需要:安裝C編譯器(如MinGW或Cygwin)了解變數、資料型別、條件語句和迴圈語句編寫包含主函數和printf()函數的第一個程式透過實戰案例(如計算平均數)練習C語言知識

編碼的關鍵:為初學者釋放 Python 的力量 編碼的關鍵:為初學者釋放 Python 的力量 Oct 11, 2024 pm 12:17 PM

Python透過其易學性和​​強大功能,是初學者的理想程式設計入門語言。其基礎包括:變數:用於儲存資料(數字、字串、列表等)。資料型態:定義變數中資料的型態(整數、浮點數等)。運算符:用於數學運算和比較。控制流程:控製程式碼執行流程(條件語句、迴圈)。

Python 的力量,簡單:一種適合初學者的程式設計方法 Python 的力量,簡單:一種適合初學者的程式設計方法 Oct 11, 2024 pm 04:53 PM

Python程式設計入門安裝Python:從官方網站下載並安裝。 HelloWorld!:使用print("HelloWorld!")列印第一行程式碼。實戰案例:計算圓面積:使用π(3.14159)和半徑計算圓面積。變數和資料類型:使用變數儲存數據,Python中的資料類型包括整數、浮點數、字串和布林值。表達式與賦值:使用運算子將變數、常數和函數連接起來,並使用賦值運算子(=)將值賦給變數。控制流程:if-else語句:根據條件執行不同的程式碼區塊,確定奇

揭秘 C:為新程式設計師提供一條清晰簡單的道路 揭秘 C:為新程式設計師提供一條清晰簡單的道路 Oct 11, 2024 pm 10:47 PM

C是初學者學習系統程式設計的理想選擇,它包含以下元件:頭檔、函數和主函數。一個簡單的C程式可以列印“HelloWorld”,需要包含標準輸入/輸出函數聲明的頭文件,並在主函數中使用printf函數來列印。透過使用GCC編譯器可以編譯和執行C程式。掌握基礎後,可以繼續學習資料類型、函數、陣列和文件處理等主題,以成為熟練的C程式設計師。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles