1. 程式人生 > >基本演算法題練習一

基本演算法題練習一

由於被很多公司的筆試程式設計題虐了,才想著要做做演算法題了。自己的基礎看來太薄弱了些。因此決定先從賽碼網的基本演算法題開始做起。這裡想記錄一下賽碼網裡面題的情況。

由於基礎薄弱,就先從兩星的題開始做起。每日兩道。

第一題:上臺階

這道題看起來比較簡單,我們可以從第一級樓梯開始分析。當樓梯只有一級時,有0種走法;當有2級時,有1種走法;有3級時,有2種走法。當有4級時,我們可以想到先從一級跳到第二級,然後二級到四級的情況就變成有3級樓梯時的走法了,這時候有2種走法到四級,同理,如果先從一級跳到第三級後,就和有2級樓梯時一樣,因此4級樓梯有2+1種。後面的情況是一樣的,如5級樓梯的就是4級的走法加3級的走法。因此可以寫出遞迴式:

f(m)=012f(m1)+f(m2)(m=1)(m=2)(m=3)(m>3)

所以呢,就是完成這個遞迴。程式碼如下:

#include <iostream>

using namespace std;


int f(int m){
    if (1 == m) {
        return 0;
    }
    else if(2 == m){
        return 1;
    }
    else if(3 == m){
        return 2;
    }
    else{
        return f(m-1)+f(m-2
); } } int main() { int n; cin>>n; int a[n]; for (int i = 0; i < n; i++) { cin>>a[i]; cout<<f(a[i])<<endl; } return 0; }

第二題:將功贖過


本題的內容就是給定了十進位制數的範圍,求這個範圍中有多少個數的二進位制表示中有m個1。
看到這道題,我想到的是在《程式設計之美》那本書中看到過求一個數二進位制表示中有多少個1的問題。因此這裡也是先寫出獲取二進位制中有多少個1的函式。接下來就比較簡單了,遍歷l~r範圍中的數,看看有多少個數的二進位制1的個數為m。
程式碼如下:

#include <iostream>

using namespace std;

//返回n轉換為二進位制後1的個數
int CountOne(int n){
    int num = 0;
    while(n){
        n &= (n - 1);
        num++;
    }
    return num;
}

int getCount(int l,int r,int m){
    int m_num = 0;
    while (l<=r) {
        if (m == CountOne(l)) {
            m_num++;
        }
        l++;
    }
    if (0 == m_num) {
        return -1;
    }

    return m_num;
}

int main(int argc, const char * argv[]) {

    int l,r,m;

    cin>>l>>r>>m;

    cout<<getCount(l,r,m)<<endl;

    return 0;
}