2013年10月5日 星期六

[C/C++ 演算法]- 數字拆解

[C/C++ 演算法]- 數字拆解



剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。


拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/SeparateNumber.htm









#include <stdio.h> 
#include <stdlib.h>
#define NUM 10 // 要拆解的數字
#define DEBUG 0

void
init(int[][NUM / 2 + 1]);
int
min(int, int);
int
f(int[][NUM / 2 + 1], int, int);
void
dp(int[][NUM / 2 + 1]);
int
count(int[][NUM / 2 + 1]);
void
print(int[][NUM / 2 + 1]);

int
main(void) {
int
table[NUM][NUM / 2 + 1] = {0};

init(table);
dp(table);
printf("可拆解出 %d 組數字\n", count(table));

if
(DEBUG) { print(table); }

return
0;
}


void
init(int table[][NUM / 2 + 1]) {
int
i;
for
(i = 0; i < NUM; i++) {
table[i][0] = 1; // 任何數用 0 以下的數拆解必只有 1 種
table[i][1] = 1; // 任何數用 1 以下的數拆解必只有 1 種
}
}


int
min(int a, int b) { return a > b ? b : a; }

int
f(int table[][NUM / 2 + 1], int x, int y) {
int
c, i;
for
(c = 0, i = 1 ; i <= y; i++) { c += table[x - i][min(x - i, i)]; }
return
c;
}


void
dp(int table[][NUM / 2 + 1]) {
int
x;
for
(x = 2; x < NUM; x++){
int
y;
for
(y = 2; y < NUM / 2 + 1 && y <= x; y++) if(x + y <= NUM) {
table[x][y] = f(table, x, y);
}
}
}


int
count(int table[][NUM / 2 + 1]) {
int
i, result;
for
(i = 1, result = 0 ; i <= NUM; i++) {
result += table[NUM - i][(NUM - i >= i) ? i : NUM - i];
}

return
result;
}


void
print(int table[][NUM / 2 + 1]) {
int
i;
for
(i = 0; i < NUM; i++) {
int
j;
for
(j = 0; j < NUM/2+1; j++) {
printf("%2d", table[i][j]);
}

printf("\n");
}
}


沒有留言:

張貼留言