#25884: C language 簡易寫法


22207807 (會打Code的貓)

學校 : 逢甲大學
編號 : 156777
來源 : [140.134.241.201]
最後登入時間 :
2023-03-14 12:33:09
a414. 位元運算之進位篇 -- c910335 | From: [42.72.86.8] | 發表日期 : 2021-07-01 11:04

#include<stdio.h>

#include<math.h>

int main () {

int n,np,a,b,p[10000] = {0},q[10000]= {0};

while(1) {

scanf("%d",&n);

if(n == 0) {

break;

}

a = 0;

b = 0;

np = n + 1;

while(n != 0) {

p[a] = n % 2;

n /= 2;

a++;

}

while(np != 0) {

q[b] = np % 2;

np /= 2;

b++;

}

if(a < b) {

printf("%d\n",b-1); 

}

if(a == b) {

for(int i = a - 1 ; i >= 0; i--) {

if(p[i] != q[i]) {

if(p[i-1] != q[i-1]) {

printf("%d\n",i);

break;

}else {

printf("0\n");

break;

}

}

}

}

}

return 0;

}

n是輸入的數字,np是n+1

加判斷n==0就直接break

先各別算出它們的二進位並用陣列儲存,注意陣列的第一個放的數字是二進位的最低位

然後我們發現只要b>a也就np的進位數比a多時,答案就是b-1個進位數(因為陣列是從0號開始)

否則a == b時,也就是它們位元數相同,我們要找出他們不一樣的時候會發生的情況

注意是從最高位開始對比,如果有不同的話則看他的下一位如果也是不同那就是有進位,他的進位數就是i,然後break

如果都一樣那就是輸出0,畢竟沒有任何進位,然後break

流程大概就是這樣~直觀的解題XD 

 
ZeroJudge Forum