描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
我の思考
好吧,我是真笨啊(~ ̄(OO) ̄)ブ,虽然想到要分情况判断,结果自己很笨就想到了一两种情况??后来才发现这是一个非常常见的数学题。把它分为了要划分的数字还有最大数字是几的情况。
我の代码
#include <iostream> using namespace std; int carry(int n,int k){ if(n==1||k==1){ return 1; } if(n==k) return carry(n,k-1)+1; if(n>k) return carry(n-k,k)+carry(n,k-1); if(n<k) return carry(n,n); } int main() { int n; while(cin>>n){ cout<<carry(n,n)<<endl;} return 0; }
我の小结
一是要加强自己划分/分类的思想QAQ,二是发现刚开始程序跑不过,后来发现题目测试虽然是一组,但是测试用了多组,所以输入要写循环才能通过。