『每日一題 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