还没有从过节的情绪中恢复过来,最近都不想写代码,越来越懒了。不想写代码,就写文档吧,今天花了一个上午时间写好了我们公司应用中定义的一个应用层协议的文档,手都打软了。。。。
下午跑到CSDN去逛了哈,看到很多人在讨论这个算法:
http://community.csdn.net/Expert/topic/5362/5362401.xml?temp=.5933344
求数值在 1 - 50 之内的任意5个数之和为100 。
数值:1,2,3,4,5,6....48,49,50
取其中的任意5个数,但这5个数相加之和要等于100,并将所有这种组合罗列
例: 1+10+19+20+50=100
3+14+16+27+40=100
不能有重复
大多数都是循环实现,我给出我的一个递归实现吧(GCC编译器,DEVCPP下编译通过,计算时间我没算,反正马上出结果,应该不到1秒):
下午跑到CSDN去逛了哈,看到很多人在讨论这个算法:
http://community.csdn.net/Expert/topic/5362/5362401.xml?temp=.5933344
求数值在 1 - 50 之内的任意5个数之和为100 。
数值:1,2,3,4,5,6....48,49,50
取其中的任意5个数,但这5个数相加之和要等于100,并将所有这种组合罗列
例: 1+10+19+20+50=100
3+14+16+27+40=100
不能有重复
大多数都是循环实现,我给出我的一个递归实现吧(GCC编译器,DEVCPP下编译通过,计算时间我没算,反正马上出结果,应该不到1秒):
1#include <conio.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <dos.h>
5
6
7#define NUM 5
8#define LOWER 1
9#define UPPER 50
10#define MATCH_TOTAL_NUM 100
11#define OUTPUT_FILENAME "result.txt"
12
13void CountNext(int *num, int length, int total);
14
15int g_num[NUM];
16static int g_totalWays = 0;
17FILE *g_fp;
18
19void CountNext(int *num, int length, int total)
20{
21 if(total < 0)
22 {
23 return;
24 }
25 for(int i = LOWER; i <= UPPER; i++)
26 {
27 if(length != NUM - 1)
28 {
29 if(g_num[length+1] >= i)
30 continue;
31 }
32
33 g_num[length] = i;
34
35 if(length == 0)
36 {
37 if(total != i)
38 {
39 if(i == UPPER)
40 {
41 return;
42 }
43 continue;
44 }
45 else
46 {
47 g_totalWays++;
48 for(int idx = 0; idx < NUM; idx++)
49 {
50 fprintf(g_fp, "%d ", g_num[idx]);
51 }
52 fputs("\n", g_fp);
53 }
54 return;
55 }
56
57 CountNext(num, length - 1, total - i);
58 }
59}
60
61int main()
62{
63 unlink(OUTPUT_FILENAME);
64 g_fp = fopen(OUTPUT_FILENAME, "at");
65 CountNext(g_num, NUM - 1, MATCH_TOTAL_NUM);
66 fclose(g_fp);
67
68 printf("Total ways = %d\n", g_totalWays);
69 getch();
70 return 0;
71}
72
2#include <stdlib.h>
3#include <stdio.h>
4#include <dos.h>
5
6
7#define NUM 5
8#define LOWER 1
9#define UPPER 50
10#define MATCH_TOTAL_NUM 100
11#define OUTPUT_FILENAME "result.txt"
12
13void CountNext(int *num, int length, int total);
14
15int g_num[NUM];
16static int g_totalWays = 0;
17FILE *g_fp;
18
19void CountNext(int *num, int length, int total)
20{
21 if(total < 0)
22 {
23 return;
24 }
25 for(int i = LOWER; i <= UPPER; i++)
26 {
27 if(length != NUM - 1)
28 {
29 if(g_num[length+1] >= i)
30 continue;
31 }
32
33 g_num[length] = i;
34
35 if(length == 0)
36 {
37 if(total != i)
38 {
39 if(i == UPPER)
40 {
41 return;
42 }
43 continue;
44 }
45 else
46 {
47 g_totalWays++;
48 for(int idx = 0; idx < NUM; idx++)
49 {
50 fprintf(g_fp, "%d ", g_num[idx]);
51 }
52 fputs("\n", g_fp);
53 }
54 return;
55 }
56
57 CountNext(num, length - 1, total - i);
58 }
59}
60
61int main()
62{
63 unlink(OUTPUT_FILENAME);
64 g_fp = fopen(OUTPUT_FILENAME, "at");
65 CountNext(g_num, NUM - 1, MATCH_TOTAL_NUM);
66 fclose(g_fp);
67
68 printf("Total ways = %d\n", g_totalWays);
69 getch();
70 return 0;
71}
72