整數拆分--java/C++
阿新 • • 發佈:2018-12-17
題目如下:
一個整數總可以拆分為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。
輸入描述:
每組輸入包括一個整數:N(1<=N<=1000000)。
輸出描述:
對於每組資料,輸出f(n)%1000000000。
java實現:
import java.io.*; import java.util.*; public class Main{ static int []a=new int [1000001]; public static void main(String []args){ a[0]=1; a[1]=1; Scanner sc=new Scanner(System.in); while(sc.hasNextLong()){ int num=(int)sc.nextLong(); System.out.println(subcompute(num)%1000000000); } } static int subcompute(int num){ //本題若採用遞迴會導致記憶體不足無法完成,所以採用空間換時間,用陣列遞推。 for(int i=1;i<=num;i++){ //本題思路:若是奇數,則與上一個偶數值相等(只是上個偶數+1的結果),若是偶數,則分為拆分結果有無1. if((i%2)==1) //注意是判斷i的奇偶性,不是a[i] a[i]=a[i-1]; else a[i]=(a[i-1]+a[i/2])%1000000000; } return a[num]; } }
C++實現:
#include<iostream> using namespace std; int a[1000001]; int compute(int num){ int i=1; for(i;i<=num;i++){ if(i%2==1) a[i]=a[i-1]; else a[i]=(a[i-1]+a[i/2])%1000000000; } return a[num]; } int main(){ a[0]=1; a[1]=1; int n; while(cin>>n){ cout<<compute(n)<<endl; } }