1. 程式人生 > >7-37 整數分解為若干項之和

7-37 整數分解為若干項之和

這題完全毫無頭緒,不看網上的答案,我認為我自己是完全寫不出來的。就算看網上的答案看懂了之後,還是覺得這題的程式碼不屬於自己。滿滿都是不安感。

將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。

輸入格式:

每個輸入包含一個測試用例,即正整數N (0<N30)。

輸出格式:

按遞增順序輸出N的所有整數分解式子。遞增順序是指:對於兩個分解序列N1={n1,n2,}和N2={m1,m2,},若存在i使得n1=m1,,ni=mi,但是n

i+1<mi+1,則N1序列必定在N2序列之前輸出。每個式子由小到大相加,式子間用分號隔開,且每輸出4個式子後換行。

輸入樣例:

7

輸出樣例:

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;7=7

#include <stdio.h>
#include <stdlib.h>

int top = -1;
int n = 0;
int i = 0;
int cnt = 1;
int sum = 0;
s[31] = {0};

void division(int i);

int main()
{
    scanf("%d", &n);
    division(1);
    system("pause");
}
void division (int i)
{
    int j;
    if(sum>n)
    {
        return;
    }
    if(sum == n)
    {
        printf("%d=", n);
        for(j=0; j<top; j++)
        {
            printf("%d+", s[j]);
        }
        if(cnt%4==0 || s[j]==n)
        {
            printf("%d\n", s[j]);
        }
        else
        {
            printf("%d;",s[j]);
        }
        cnt++;
        return;
    }
    for(j=i; j<=n; j++)
    {
        s[++top] = j;
        sum += j;
        division(j);
        top--;
        sum -= j;
    }
}