“藍橋杯”演算法大賽·基礎演算法
第1題 閏年還是平年?
問題描述
給定一個年份,判斷這一年是不是閏年。
閏年滿足且僅滿足以下情況中的1種:(a)年份是4的倍數而不是100的倍數;(b)年份是400的倍數。不滿足上述任意一種情況的都是平年。
規則約定
輸入
輸入包含一個整數y,表示當前的年份。
輸出
輸出一行,如果給定的年份是閏年,則輸出yes,否則輸出no。
> 2003
no
> 2006
yes
資料規模與約定
參考程式碼
C++
#include <iostream> using namespace std; int main() { int year; cin >> year; if (!(year % 400) || (!(year % 4) && (year % 100))) cout << "yes"; else cout << "no"; return 0; }
Java
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int year = scanner.nextInt(); if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) System.out.println("yes"); else System.out.println("no"); scanner.close(); } }
計算思想
C++對型別限制並不嚴格,編譯器將0作為false,將非0值作為true,在計算時,可以直接省略條件判斷部分,直接將得到的餘數作為布林值。
Java則是型別安全的,對型別有嚴格限制。在計算時,必須完整寫出判斷語句。
第2題 01字串
問題描述
對於長度為5位的一個01串,每一位都可能是0或1,一共有32種可能,請按從小到大的順序輸出這32種01串。
規則約定
輸入
無
輸出
從00000到11111的32個字串
>
00000
00001
00010
00011
……
參考程式碼
C++
#include <iostream> #include <bitset> using namespace std; int main() { for (auto i = 0b0; i <= 0b11111; i++) cout << bitset<5>(i) << endl; return 0; }
Java
public class Test {
public static void main(String[] args) {
for (Integer i = 0b0; i <= 0b11111; i++) {
String string = Integer.toBinaryString(i);
string = String.format("%5s", string);
string = string.replace(' ', '0');
System.out.println(string);
}
}
}
計算思想
“01串”,即以二進位制形式表示的數字,我們可以藉助C++/Java中關於進位制轉換的函式/包實現演算法。
除了Binary(二進位制)外,這個演算法理念同樣適用於Octal(八進位制)、Decimal(十進位制)、Hexadecimal(十六進位制)。其他所有進位制只能按位進行暴力for迴圈(像下面這樣,以C++實現8位五進製為例,非常難看):
for (auto i = 0; i <= 4; i++)
for (auto j = 0; j <= 4; j++)
for (auto k = 0; k <= 4; k++)
for (auto m = 0; m <= 4; m++)
for (auto n = 0; n <= 4; n++)
for (auto p = 0; p <= 4; p++)
for (auto q = 0; q <= 4; q++)
cout << i << j << k << m << n << p << q << endl;
C++
<bitset>是C++中的一個標準類庫,屬於C++ STL(標準模板庫)的一部分,它讓我們方便地自定義並管理二進位制位。<bitset>的好處在於——當你指定了位長度後,<bitset>會在不足的位上補0。我們藉助for迴圈,從0b0到0b11111生成32個(bitset<5>),直接用cout進行輸出。
Java
String java.lang.Integer.toBinaryString(int i)是java.lang.Integer(整數)類的一個靜態方法,它將Integer物件轉化為以二進位制表示的String(字串)。但轉換結果的長度只保留有實際意義的部分,無法滿足題目需求。
String java.lang.String.format(String format, Object... args)是java.lang.String(字串)類的一個靜態方法,它將物件轉換為格式字串所指定的“標準樣式”。我們使用"%5s"將二進位制數固定為5位,原結果右對齊,不足5位則用空格補齊。
String java.lang.String.replace(char oldChar, char newChar)是java.lang.String類的一個靜態方法,它將指定的舊字元替換為新字元。我們將所有空格替換為0,至此完成所有格式調整。