1. 程式人生 > >整數拆分--java/C++

整數拆分--java/C++

題目如下:

一個整數總可以拆分為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;
    }
}