2009年华为软件研发一笔试题

/*
*    功能:输出一个数组中和为每个指定数的所有组合数
*    日期:2011/7/28
*    作者:milo
*    不足:对于有多个重复数字,会输出重复的组合数,可以通过遍历一个数组链表解决。
*/

#include<stdio.h>
#include<stdlib.h>

int *dst_array,top=0;//中间数组,存放中间求解过程

//打印长度为n的数组元素
static void printA(int *parray,int n)
{
    int i;
    for(i=0;i<n;i++){
        printf("%d ",parray[i]);
    }
}

//求解数组sorted_array中数之和为sum所有组合
static  void print_array(int *sorted_array,int len,int sum)
{
    if(len<1 || sorted_array[0]>sum)    return ;//情况一:当前元素大于sum,不符合条件,返回
    print_array(sorted_array+1,len-1,sum);//情况二:不包含当前元素的所有和为sum的组合
    dst_array[top++]=sorted_array[0];//情况三:包含当前元素
    if(sorted_array[0]==sum){//情况三-1:截止到当前元素
        printA(dst_array,top);
        printf("\n");
        top--;
        return;
    }
    print_array(sorted_array+1,len-1,sum-sorted_array[0]);//情况三-2:包含当前元素但尚未截止
    top--;//返回前恢复top值
}

//使用qsort的比较函数
static int my_cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

int main()
{
    int num,*parray;//存放数据的数组,及数组个数
    scanf("%d",&num);
    parray=(int *)malloc(sizeof(int)*num);
    dst_array=(int *)malloc(sizeof(int)*num);
    int i;
    for(i=0;i<num;i++){//初始化数组
        scanf("%d",&parray[i]);
    }
    qsort(parray,num,sizeof(int),my_cmp);//排序数组
    print_array(parray,num,100);//求数组中和为100的所有数的组合
    return 0;
}

你可能感兴趣的:(ini,华为,DST)