# Bit Manipulation# Arithmetic# Simulation

d632 - C and S ??

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬一個布林函數的運算,給定兩個 32 位元的數列 A 和 B,計算 S 數列和 C' 數列。然而,程式碼僅計算了 S 數列,並進行了加法運算,實際上模擬的是 A + B 的位元運算,並處理了進位。題目描述中的 S 和 C' 的定義並未在程式碼中實現。

解題思路

程式碼讀取兩個 32 位元的字串 A 和 B,然後將它們的對應位元相加。如果某一位的總和大於 1,則將進位加到前一位。最後,程式碼輸出結果數列。程式碼實際上模擬了二進位加法,但題目描述與程式碼的實際功能不符。程式碼的邏輯是將兩個輸入字串的每個字符的 ASCII 值相加,然後處理進位。

複雜度分析

  • 時間複雜度: O(N),其中 N 是字串的長度 (32)。程式碼需要遍歷字串兩次,一次用於讀取輸入,一次用於計算和輸出結果。
  • 空間複雜度: O(1)。程式碼使用固定大小的陣列來儲存輸入和輸出,空間使用不隨輸入大小變化。

程式碼

#include <stdio.h>
using namespace std;
char a[33],b[33];
int main(){
	int k=1120;
	while(k--){
		for(int i=0;i<33;++i){
			scanf("%c",&a[i]);
			printf("%c",a[i]);
		}
		printf("\n");
		for(int i=0;i<33;++i){
			scanf("%c",&b[i]);
			printf("%c",b[i]);
			a[i]+=b[i];
			a[i]-='0';
		}
		printf("\n---------------------------------\n");
		for(int i=32;i>=0;--i){
			if(a[i]>'1'){
				a[i-1]++;
				a[i]-=2;
			}
		}
		for(int i=0;i<32;++i){
			printf("%c",a[i]);
		}
		printf("\n****End of Data******************\n");
	}
}

Discussion