数的拆分 有一步判重特别重要!
突然想起要打上题目
【题目】
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14
【代码】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> using namespace std; int n,h; int a[100]= {1}; //开始必须为1; int search(int,int); int print(int); int main() { cin>>n; search(n,1); cout<<"total="<<h<<endl; return 0; } int search(int s,int t) { for(int i=a[t-1]; i<=s; i++) //此步为判重 比前一个数大,比总数小,避免重复. if(i<n) { //防止7=7的现象产生!!这点非常重要 a[t]=i; s-=i; if(s==0) print(t); //当需要拆分的数是0的时候结束 else search(s,t+1); //继续搜索下一个 s+=i; //回溯 } } int print(int t) { cout<<n<<"="; for(int i=1; i<=t-1; i++) cout<<a[i]<<"+"; cout<<a[t]<<endl; h++; }