使用分治法解决如下问题
问题:将正整数n表示成一系列正整数之和n=n1+n2+...+nk(其中,n1>=n2>=...>=nk>=1,k>=1),求任意正整数n的划分数(n<10)。
举例:整数5有如下5种划分:
5=4+1,5=3+2,5=3+1+1,5=2+1+1+1,5=1+1+1+1+1
#include <stdio.h> #include <iostream> using namespace std; int bufferArray[1000] = { 0 };//缓存数组 int bufferLenth = 0;//缓存数组的当前长度 int outputSignal = -1;//当前输出的控制信号 int total = 0;//划分的总数 //划分整数 ,number=要划分的数字,tempNumber=划分的数字 void dividedInt(int number, int tempNumber) { if (number <= 0) return; if (number >= tempNumber) { total++; //输出信号不为-1,当缓存数组长度大于0,且缓存数组的首位不等于输出信号,或者缓存数组为0,且要划分的数字不等于输出信号 if (outputSignal>-1 && ((bufferLenth>0 && bufferArray[0] != outputSignal) || (bufferLenth == 0 && number != outputSignal))) printf("\n"); //否则如果输出信号大于1 else if (outputSignal>1) printf(","); //输出缓存数组 if (bufferLenth>0) { for (int i = 0; i<bufferLenth; i++) printf("%d+", bufferArray[i]); outputSignal = bufferArray[0]; } else outputSignal = number; printf("%d", number); if (tempNumber>0) printf("+%d", tempNumber); //分治法---当划分的数字大于1 if (tempNumber>1) { bufferArray[bufferLenth++] = number; dividedInt(tempNumber - 1, 1); bufferLenth--; } } //分治法--当要划分的数字小于划分的数字 else { bufferArray[bufferLenth++] = number; dividedInt(number, tempNumber - number); bufferLenth--; } //分治法--当要划分的数字大于1 dividedInt(number - 1, tempNumber + 1); } int main() { int number; cout<<"请输入一个整数进行划分"<<endl; scanf("%d", &number); printf("开始划分:\n"); dividedInt(number, 0); printf("\n总数:%d", total); return 0; }
建议使用vc++6.0