題目
描述:
乙個整數總可以拆分為2的冪的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
總共有六種不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的種數,例如f(7)=6.
要求編寫程式,讀入n(不超過1000000),輸出f(n)%1000000000。
題目類別: null
難度: 初級
執行時間限制: 10sec
記憶體限制: 128mbyte
階段: 入職前練習
輸入:
每組輸入包括乙個整數:n(1<=n<=1000000)。
輸出:
對於每組資料,輸出f(n)%1000000000。
輸出有多行,每行乙個結果。
輸入資料如果超出範圍,輸出-1。
樣例輸入:
7樣例輸出:
6
思路
當n=2k+1為奇數時,f(2k+1)=f(2k)。其實2k+1的拆分第一項肯定為1,若去掉這個1,就和2k的拆分一樣了。
當n=2k為偶數時,我們考慮有1和沒有1的拆分。若有1,則前2項均為1,就和2k-2的拆分一樣了。
若沒有1,則將每項除以2,就和k的拆分一樣了。故有f(2k)=f(2k-2)+f(k);
**一
/*---------------------------------------
* 日期:2015-06-30
* 題目:整數分隔
-----------------------------------------*/
#include
#include
#include
#include
using
namespace
std;
#define max 1000000
int count[max+1];
int split(int n)//if
else//else
}//for
return count[n];
}int main()//if
cout
return
0;}
**二
超時
/*---------------------------------------
* 日期:2015-06-30
* 題目:整數分隔
-----------------------------------------*/
#include
#include
#include
#include
using
namespace
std;
#define max 1000000
int split(int n)//if
if(n == 2)//if
// 奇數
if(n % 2)//if
else//else
}int main()//if
cout
return
0;}
華為機試練習題 6 整數排序
題目 描述 實現輸入一組大於等於0的整數,根據從小到大的順序排序後輸出,排序後有連續數時,只輸出連續數中最小和最大的兩個數。題目類別 排序 難度 高階 執行時間限制 10sec 記憶體限制 128mbyte 階段 入職前練習 輸入 一組大於等於0的整數,不考慮非法輸入,各個整數之間以逗號 分隔,輸入...
華為機試練習題1
題目描述 有這樣一道智力題 某商店規定 三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?答案是5瓶,方法如下 先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一瓶汽水,喝掉這瓶滿的,喝完以...
華為機試練習題 28 報數
題目 描述 有n個人圍成一圈,順序排號。從第乙個人開始報數 從1到3報數 凡報到3的人退出,問最後留下的那位是原來第幾號。題目類別 陣列,指標難度 初級執行時間限制 10sec記憶體限制 128mbyte階段 入職前練習輸入 使用標準輸入stdio.多行,每行一組資料。輸出 多行,每行對應求和結果。...