求和为指定数字的所有组合

(July——微软等面试100题 21和25http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html

21.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.

 

解法:采用0-1背包的思想,使用递归方法:

  当选择n时,就用剩下的n-1填满 m-n;

  当不选择n是,就用剩下的n-1填满m;

 注意的是,当m=n时,即找到了符合条件的解。

 1 #include<iostream>
 2 #include<list>
 3 using namespace std;
 4 
 5 list<int> list1;
 6 void find(int sum, int n)
 7 {
 8     //递归出口
 9     if(sum <= 0 || n <= 0)
10         return;
11 
12     //输出找到的结果
13     if(sum == n)    //表示找到了一个值
14     {
15         list1.reverse();    //使输出顺序更规范
16         for(list<int>::iterator i = list1.begin(); i != list1.end(); i++)
17             cout << *i <<" ";
18         cout << n << endl;
19         list1.reverse();
20     }
21 
22     list1.push_front(n);
23     find(sum-n, n-1);    //如果放入n,则从剩余n-1个数中填满sum-n
24     list1.pop_front();
25     find(sum, n-1);        //如果不放入n,从n-1个数中填满sum
26 }
27 
28 int main()
29 {
30     int sum, n;
31     sum = 6;
32     n = 8;
33     find(sum, n);
34 
35     system("pause");
36     return 0;
37 }

 25.写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。
例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 #define MAX 100
 7 
 8 char str[MAX+1];
 9 char outstr[MAX+1];
10 
11 int continuemax(char *str, char *outstr)
12 {
13     int length = strlen(str);
14 
15     char temp[MAX];
16     int index = 0, maxl = 0;
17     for(int i = 0; i < length; i++)
18     {
19         if(str[i] >= '0' && str[i] <= '9')
20             temp[index++] = str[i];
21         else
22         {
23             if(maxl < index)
24             {
25                 temp[index] = '\0';
26                 maxl = index;
27                 strncpy(outstr, temp, MAX);
28             }
29             index = 0;
30         }
31     }
32     if(maxl < index)    //防止出现数字在最后的情况
33     {
34         temp[index] = '\0';
35         maxl = index;
36         strncpy(outstr, temp, MAX);
37     }
38     return maxl;
39 }
40 
41 int main()
42 {
43     strncpy(str, "abcd12345ed125ss123456789", MAX);        //strncpy只有在源字符串短于100是才会在 str最后加上\0,当被截断时,不保证后面有null字符
44     str[MAX] = '\0';
45 
46     int t = continuemax(str, outstr);
47 
48     printf("%d length, number is %s.\n", t, outstr);
49 
50     system("pause");
51     return 0;
52 }

 

posted @ 2012-09-26 21:36  dandingyy  阅读(3587)  评论(0编辑  收藏  举报