華為機試練習題 14 整數分隔

2021-09-23 22:52:17 字數 1858 閱讀 6882

題目

描述:     

乙個整數總可以拆分為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.多行,每行一組資料。輸出 多行,每行對應求和結果。...