整数划分--分治求解

使用分治法解决如下问题

问题:将正整数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

猜你喜欢

转载自www.cnblogs.com/wxh-blos/p/12093730.html