关闭

整数分隔

158人阅读 评论(0) 收藏 举报
分类:
描述:     
一个整数总可以拆分为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);


#include<iostream>

using namespace std;

int f[1000001];
void main(){
	//int  f[1000000];运行结果报错。
        int n;
        cout << "input:" << endl;
	cin >> n;
	f[1] = 1;
	for (int i = 2; i <= n; i++){
		if (i % 2 == 0)
			f[i] = (f[i - 1] + f[i / 2]) % 1000000000;
		else
			f[i] = f[i - 1];
	}
	cout << "output:" << endl;
	cout << f[n] << endl;
	system("pause");

}

Second time

#include<iostream>
using namespace std;

int A[1000001];
int spilt(int n){
	//int  A[1000000]; 放这里的话运行出错
	A[1] = 1;
	for (int i = 2; i <= n; i++){
		if (i % 2 == 0)
			A[i] = (A[i - 1] + A[i / 2])%1000000000;
		else
			A[i] = A[i - 1];		
		
	}
	return A[n];
}

void main(){
	int  n;
	cout << "input:" << endl;
	cin >> n;	
	cout << "output:" << endl;
	cout <<spilt(n) << endl;
	system("pause");

}



   
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20837次
    • 积分:1248
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论