基本演算法題練習一
阿新 • • 發佈:2019-01-31
由於被很多公司的筆試程式設計題虐了,才想著要做做演算法題了。自己的基礎看來太薄弱了些。因此決定先從賽碼網的基本演算法題開始做起。這裡想記錄一下賽碼網裡面題的情況。
由於基礎薄弱,就先從兩星的題開始做起。每日兩道。
第一題:上臺階
這道題看起來比較簡單,我們可以從第一級樓梯開始分析。當樓梯只有一級時,有0種走法;當有2級時,有1種走法;有3級時,有2種走法。當有4級時,我們可以想到先從一級跳到第二級,然後二級到四級的情況就變成有3級樓梯時的走法了,這時候有2種走法到四級,同理,如果先從一級跳到第三級後,就和有2級樓梯時一樣,因此4級樓梯有2+1種。後面的情況是一樣的,如5級樓梯的就是4級的走法加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;
}