基本演算法(整數劃分)
阿新 • • 發佈:2018-12-27
#include <stdio.h>
int main()
{
int s, i, j, k, t, u; static int a[21][800][21]; printf("input s(s<=20):"); scanf_s("%d", &s); a[2][1][1] = 1; a[2][1][2] = 1; a[2][2][1] = 2; u = 2; for (k = 3; k <= s; k++) {
for (j = 1; j <= u; j++) {
a[k][j][1] = 1; for (t = 2; t <= k; t++) // 實施在k−1所有劃分式前加1操作 a[k][j][t] = a[k-1][j][t-1]; } for (i = u, j = 1; j <= u; j++) if (a[k-1][j][1]<a[k-1][j][2]) // 若k−1劃分式第1項小於第2項 {
i++; // 第1項加1為k的第i個劃分式的第1項 a[k][i][1] = a[k-1][j][1] + 1; for (t = 2; t <= k-1; t++) a[k][i][t] = a[k-1][j][t]; } i++; a[k][i][1] = k; // k的最後一個劃分式為:k=k u = i; } for (j = 1; j <= u; j++) // 輸出s的所有劃分式 {
printf("%3d: %d=%d", j, s, a[s][j][1]); i = 2; while (a[s][j][i]>0) {
printf("+%d", a[s][j][i]); i++;
} printf("\n"); }
return 0;
}
int s, i, j, k, t, u; static int a[21][800][21]; printf("input s(s<=20):"); scanf_s("%d", &s); a[2][1][1] = 1; a[2][1][2] = 1; a[2][2][1] = 2; u = 2; for (k = 3; k <= s; k++) {
for (j = 1; j <= u; j++) {
a[k][j][1] = 1; for (t = 2; t <= k; t++) // 實施在k−1所有劃分式前加1操作 a[k][j][t] = a[k-1][j][t-1]; } for (i = u, j = 1; j <= u; j++) if (a[k-1][j][1]<a[k-1][j][2]) // 若k−1劃分式第1項小於第2項 {
i++; // 第1項加1為k的第i個劃分式的第1項 a[k][i][1] = a[k-1][j][1] + 1; for (t = 2; t <= k-1; t++) a[k][i][t] = a[k-1][j][t]; } i++; a[k][i][1] = k; // k的最後一個劃分式為:k=k u = i; } for (j = 1; j <= u; j++) // 輸出s的所有劃分式 {
printf("%3d: %d=%d", j, s, a[s][j][1]); i = 2; while (a[s][j][i]>0) {
printf("+%d", a[s][j][i]); i++;
} printf("\n"); }
return 0;
}