[华为机试练习题]14.整数分隔

来源:互联网 发布:java游戏合集 编辑:程序博客网 时间:2024/05/22 06:34

题目

描述:     一个整数总可以拆分为2的幂的和,例如:7=1+2+47=1+2+2+27=1+1+1+47=1+1+1+2+27=1+1+1+1+1+27=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*   作者:SJF0115*   题目:整数分隔*   来源:华为上机-----------------------------------------*/#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std;#define Max 1000000int Count[Max+1];int Split(int n){    Count[1] = 1;    Count[2] = 2;    for(int i = 3;i <= n;++i){        // 奇数        if(i % 2){            Count[i] = Count[i-1];        }//if        else{            Count[i] = (Count[i-2] + Count[i/2]) % 1000000000;        }//else    }//for    return Count[n];}int main(){    int n;    //freopen("C:\\Users\\Administrator\\Desktop\\c++.txt","r",stdin);    while(cin>>n){        if(n > Max || n < 0){            return -1;        }//if        cout<<Split(n)<<endl;    }//while    return 0;}

代码二

超时

/*---------------------------------------*   日期:2015-06-30*   作者:SJF0115*   题目:整数分隔*   来源:华为上机-----------------------------------------*/#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std;#define Max 1000000int Split(int n){    if(n == 1){        return 1;    }//if    if(n == 2){        return 2;    }//if    // 奇数    if(n % 2){        return Split(n-1) % 1000000000;    }//if    else{        return Split(n-2) % 1000000000 + Split(n/2) % 1000000000;    }//else}int main(){    int n;    //freopen("C:\\Users\\Administrator\\Desktop\\c++.txt","r",stdin);    while(cin>>n){        if(n > Max){            return -1;        }//if        cout<<Split(n)<<endl;    }//while    return 0;}
1 0
原创粉丝点击