# Bit Manipulation# Number System# Decimal to Binary

e545 - 10019 - Funny Encryption Method

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀入一個十進制整數 N,然後計算兩個值 b1 和 b2。b1 是 N 的二進制表示中 1 的個數,b2 是 N 的十六進制表示轉換為二進制後 1 的個數。最後輸出 b1 和 b2,以空格分隔。

解題思路

解題思路主要分為以下幾個步驟:

  1. 將輸入的十進制數 N 轉換為二進制字符串,並計算其中 1 的個數,得到 b1。
  2. 將輸入的十進制數 N 視為十六進制數,轉換為二進制字符串,並計算其中 1 的個數,得到 b2。
  3. 輸出 b1 和 b2,以空格分隔。

程式碼中,使用位運算 a % 2a >>= 1 來計算十進制數轉換為二進制後的 1 的個數。對於十六進制轉換為二進制,先將十六進制數轉換為十進制數,再將十進制數轉換為二進制數,然後計算 1 的個數。

複雜度分析

  • 時間複雜度: O(log N)
  • 空間複雜度: O(1)

程式碼

#include <stdio.h>
int main(){
	int a;
	scanf("%d",&a);
	while(scanf("%d",&a)>0){
		int b1=0,b2=0,c=a,d=0,n=1;
		while(a>0){
			if(a%2){
				b1++;
			}
			a>>=1;
		}
		while(c>0){
			d+=c%10*n;
			c/=10;
			n*=16;
		}
		while(d>0){
			if(d%2){
				b2++;
			}
			d>>=1;
		}
		printf("%d %d\n",b1,b2);
	}
}

Discussion