弱_求一个算法源码
问题:有一组数字例如1,2,3,4,5,6,7,8,9; 要得到该组数中相加结果为10的数字;并且相加的数字不能多于3个;
如:2+3+5=10; 1+4+5=10; 1+9=10;...即可
并且将该相加的几个数分别打印出来
求源码,谢谢!
[解决办法]
算法探讨:据说是阿里的一道面试算法题
3楼的大牛(^^)把代码都写得差不多了,不能超过3个的话,限制递归次数就可以了
其他人也提到很多思路,实现方法总归应该不止一种
ps,lz你不会就是刚阿里面试回来的吧
[解决办法]
- C/C++ code
#include <stdio.h>#include <malloc.h>#define LEN 9int array[LEN] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int rst = 10;//输出void output(int *num, int m){ int i, sum = 0; for(i = 0; i < m; ++i) if(num[i] == 1) sum += array[i]; if(sum == rst) { for(i = 0; i < m; ++i) if(num[i] == 1) printf("%d ", array[i]); printf("\n"); }}//检测n个“1”是否全部移动到最右端//是则返回1int check(int *num, int m, int n){ int i, flag = 1; for(i = m-1; i > m-n-1; --i) { if(*(num+i) == 0) { flag = 0; break; } } return flag;}void chooseNum(int m, int n){ int *num, i, j, count; num = (int*)malloc(sizeof(int)*m); for(i = 0; i < n; ++i)//前n个元素置1 *(num+i) = 1; if(m == n) { output(num, m); return; } for(i = n; i < m; ++i)//后面m-n个元素置0 *(num+i) = 0; output(num, m); while(1) { count = 0; //找到第一个“10”组合后将其变为“01”组合 for(i = 0; i < m-1; ++i) { if(*(num+i) == 1 && *(num+i+1) == 0) { *(num+i) = 0; *(num+i+1) = 1; break; } if(*(num+i) == 1) ++count; } //将其左边的所有“1”全部移动到数组的最左端 for(j = 0; j < i; ++j) { if(j < count) *(num+j) = 1; else *(num+j) = 0; } output(num, m); if(check(num, m, n) == 1) break; } free(num); }int main(){ int i; for(i = 1; i <= 3; ++i) chooseNum(LEN, i); return 0;}4 63 72 81 92 3 51 4 51 3 61 2 7