#include #include #include #include typedef struct { int n; int nexpr; char **expr; char *etype; } EXPR; void combineexpr ( char *str, char *e1, char *e2, char e1type, char e2type, char op ) { if (op == '+') sprintf(str, "%s+%s", e1, e2); else { if ((e1type == '+') && (e2type == '+')) sprintf(str, "(%s)*(%s)", e1, e2); else if (e1type == '+') sprintf(str, "(%s)*%s", e1, e2); else if (e2type == '+') sprintf(str, "%s*(%s)", e1, e2); else sprintf(str, "%s*%s", e1, e2); } } EXPR findallexpr ( int n ) { EXPR E, *F; int i, j, k, l, s, u, v, w; char *str; str = (char *)malloc(4 * n * sizeof(char)); F = (EXPR *)malloc((n+1) * sizeof(EXPR)); F[0].n = 0; F[0].nexpr = 0; F[0].expr = NULL; F[0].etype = NULL; F[1].n = 1; F[1].nexpr = 1; F[1].expr = (char **)malloc(sizeof(char *)); F[1].expr[0] = (char *)malloc(2 * sizeof(char)); strcpy(F[1].expr[0], "1"); F[1].etype = (char *)malloc(sizeof(char)); F[1].etype[0] = '+'; for (i=2; i<=n; ++i) { l = 0; for (j=1; j<=i/2; ++j) { k = i - j; l += F[j].nexpr * F[k].nexpr; } s = (int)sqrt(i); for (j=2; j<=s; ++j) { if (i % j == 0) { k = i / j; l += F[j].nexpr * F[k].nexpr; } } F[i].n = i; F[i].nexpr = l; F[i].expr = (char **)malloc(l * sizeof(char *)); F[i].etype = (char *)malloc(l * sizeof(char)); l = 0; for (j=1; j<=i/2; ++j) { k = i - j; for (u=0; u=0; --j) { for (i=0; i<=j; ++i) { if (N1[i] > N1[i+1]) continue; if ((N1[i] == N1[i+1]) && (strlen(E.expr[i]) >= strlen(E.expr[i+1]))) continue; k = N1[i]; N1[i] = N1[i+1]; N1[i+1] = k; t = E.expr[i]; E.expr[i] = E.expr[i+1]; E.expr[i+1] = t; c = E.etype[i]; E.etype[i] = E.etype[i+1]; E.etype[i+1] = c; } } } void printallexpr ( EXPR E ) { int l; printf("%-3d", E.n); for (l=0; l 1) n = atoi(argv[1]); else scanf("%d", &n); printf("n = %d\n", n); E = findallexpr(n); printf("\n+++ Before sorting\n"); printallexpr(E); sortexpr(E); printf("\n+++ After sorting\n"); printallexpr(E); exit(0); }