首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

弱_算法源码

2012-02-12 
弱_求一个算法源码问题:有一组数字例如1,2,3,4,5,6,7,8,9要得到该组数中相加结果为10的数字并且相加的数

弱_求一个算法源码
问题:有一组数字例如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 

热点排行