1. 程式人生 > >“藍橋杯”演算法大賽·基礎演算法

“藍橋杯”演算法大賽·基礎演算法

第1題  閏年還是平年?

問題描述

給定一個年份,判斷這一年是不是閏年。

閏年滿足且僅滿足以下情況中的1種:(a)年份是4的倍數而不是100的倍數;(b)年份是400的倍數。不滿足上述任意一種情況的都是平年。

規則約定

輸入

輸入包含一個整數y,表示當前的年份。

輸出

輸出一行,如果給定的年份是閏年,則輸出yes,否則輸出no。

> 2003

      no

> 2006

     yes

資料規模與約定

1990 \leq y \leq 2050

參考程式碼

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,至此完成所有格式調整。