求和为指定数字的所有组合
(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 }