這道經典的藍橋杯基礎練習題目要求我們輸出所有長度為5的01字串,按從小到大的順序排列。對於5位二進制數,每一位只能是0或1,總共有2^5 = 32種可能的組合。前幾個依序為:
00000 00001 00010 00011 00100 ...
題目沒有輸入,只需直接輸出這32行字串。這其實就是模擬二進制計數器從0遞增到31的過程。
最直觀的方法是使用一個長度為5的整型數組模擬二進制加法。從最低位(數組索引0)開始加1,若該位大於等於2則進位:將該位取模2,進位值加到下一位,以此類推直到無進位為止。每次完成加法後,從高位到低位輸出數組內容即可得到一個01字串。
#include <stdio.h>
int main(void) {
int a[5] = {0}; // 初始化為00000
int temp, times, i;
printf("00000\n"); // 直接輸出第一個
for (times = 1; times <= 31; times++) {
i = 0;
a[i] += 1; // 最低位加1
// 處理進位
while (a[i] >= 2) {
temp = a[i] / 2;
a[i] = a[i] % 2;
i++;
a[i] = a[i] + temp;
}
// 從高位到低位輸出
for (i = 4; i >= 0; i--) {
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}
a[5]對應二進制的5位,索引0為最低位(最右邊),索引4為最高位(最左邊)while循環處理連續進位情況,如00011加1變成00100程序將按順序輸出:
00000 00001 00010 00011 00100 00101 00110 00111 01000 ... 11111
這種模擬二進制加法的方法不僅解決了本題,也為理解計算機底層算術運算提供了直觀示例。同樣的思想可以擴展到任意位數的二進制生成,或進一步應用於大數加法運算中。