閱讀365 返回首頁    go 阿裏雲 go 技術社區[雲棲]


『每日一題 2012-02-13』整數劃分問題

問題描述:

對於正整數n=6,可以分劃為: 
6 
5+1 
4+2, 4+1+1 
3+3, 3+2+1, 3+1+1+1 
2+2+2, 2+2+1+1, 2+1+1+1+1 
1+1+1+1+1+1+1 
現在的問題是,對於給定的正整數n,編寫算法打印所有劃分。

算法實現:

可以求出具體劃分方式

#include <stdio.h>
#define MAX 100
int d[MAX]; /* 用來存放分解結果 */

void decompose(int m, int n, int k); /* 將m分解為不大於n的組成數,k>=0是項號 */

int main()
{
    int n;
    printf("input n:");
    scanf("%d", &n);
	decompose(n, n, 0);
    return 0;
}

void decompose(int m, int n,int k)
{
    int i;
	
    if (m == 0) 
	{ /* 當m為0時,得到一個劃分,將分解結果輸出 */
        printf("%d", d[0]);
        for (i=1; i<k; i++)
            printf("+%d", d[i]);
        for (i=1; i< k; i++) /* for + if 處理輸出格式 */
            if (d[i] != 1)
                break;
		if (i == k) 
			printf("\n");
		else
			printf(", ");
		return;
    }
    for (i=(m<n?m:n); i>0; i--) 
	{ /* 一次分解的幾種可能分法 */
        if (i < n)
            d[k] = i;
        else
            d[k] = n;
        decompose(m-d[k], d[k], k+1); /* 遞歸調用使分解繼續下去,直到得到一個劃分 */
    }
}

求出劃分個數:


#include <stdio.h>

int split(int n,int m);

int main()
{
	int n;
	printf("Please input an integer:\n");
	scanf("%d",&n);
	int sum=split(n,n);
	printf("%d\n",sum);
	return 0;
}
int split(int n,int m)
{
	if (1==n || 1==m)
	{
		return 1;
	}
	if (n==m)
	{
		return 1+split(n,m-1);
	}
	if (m>n)
	{
		split(n,n);
	}
	else
	{
		return split(n,m-1)+split(n-m,m);
	}
}

更多了解,可以點擊:

https://baike.baidu.com/view/4491942.htm

https://www.programfan.com/acm/show.asp?qid=57

最後更新:2017-04-02 22:16:21

  上一篇:go XCode4配置three20,自己記錄下
  下一篇:go 歐拉項目【ProjectEuler】係列-第一題