`

算法题:求四个数的和为定值的组合

c 
阅读更多
算法题:有数组【1,2,3,...10】,请找出四个数的和为16的这四个数。请给出算法。

/***
*a.cpp  - In order to solve the specified sum of several numbers in a array
*
*       Copyright (c) 2012. All rights reserved.
*
*Purpose:
*
****/
#include <iostream>
#include <stdarg.h>
#define LEN 10
#define N 4
#define LEN1 20
using namespace std;

struct elem{
	int start;
	int tail;
	int num;
	int value;
	int str[LEN1];
};
typedef struct elem ELEM;

enum err{debug,run};
typedef enum err ERR;

void sort(int * p);
void find(const int * p, ELEM e);
void printArray(int *p,...);
void scanfArray(int *p);
void printErr(ERR level);
void copyArray(int in[],int *p);


/************************************************************************/
/* 假设输入到数组中的值都是大于零的数                                   */
/************************************************************************/

void main()
{
	int arr[LEN];
	int sum = 16;

	scanfArray(arr); // input array
	printf("Please Enter a number:\n");
	scanf("%d",&sum);

	sort(arr); // sort arr
	printArray(arr,0);

	printf("输出的组合:\n");
	int start = 0, tail = LEN, num = N;
	ELEM e = {start,tail,N,sum,{0}};
	find(arr,e);


}
void scanfArray(int *p){
	printf("Please Enter %d Numbers:\n",LEN);
	for (int i = 0; i < LEN; i++)
	{
		scanf("%d",&p[i]);
	}
}

void sort(int * p){
	int tmp;

	for (int i = 0; i < LEN-1; i++)
	{
		for (int j = 1; j < LEN-i; j++)
		{
			if (p[j-1]>p[j])
			{
				tmp = p[j];
				p[j] = p[j-1];
				p[j-1] = tmp;
			}
		}
	}
	
}

void printArray(int *p,...){
    va_list arg_ptr;
    va_start(arg_ptr,p);
	int num = va_arg(arg_ptr,int);
	if (num == 0)
	{
		num = LEN;
	}
	 
	
	printf("[");
	for (int i = 0; i < num; i++)
	{
		printf(" %d ,",p[i]);
	}
	printf("\b]\n");
}

void find(const int * p, ELEM e){

	int start = e.start;
	int tail = e.tail;
	int num = e.num;
	int value = e.value;

	// adjust the value of start and tail
	if(start+num<=tail){
		
		if (value<p[start])
		{
			printErr(debug);
			return;
		}else{
			for (int j = tail; j >start; j--)
			{
				if(p[j]<=value){
					tail = j;
					break;
				}
			}
				
		}
	}else{
		printErr(debug);
		return;
	}

	if (num<2)
	{
		printErr(debug);
		return;
	}else if(num==2){

		int i = start;
		int j = tail;
		while (i<j)
		{
			if (p[i]+p[j]==value)
			{
				e.str[N-num] = p[i];
				e.str[N-num+1] = p[j];
				printArray(e.str,N);
				i++;j--;
			}else if(p[i]+p[j]<value){
				i++;
			}else{
				j--;
			}
		}
		
	}else{

		for (int i = start; i < tail; i++)
		{
			e.str[N-num] = p[i];
			ELEM tmp = {i+1,tail,num-1,value-p[i]};
			copyArray(e.str,tmp.str);
			find(p,tmp);

		}

	}

}

void copyArray(int in[],int *p){

	for (int i = 0; i<LEN1; i++)
	{
		p[i] = in[i];

	}

}

void printErr(ERR level){

	switch (level)
	{
	case debug:
	//	fprintf(stderr,"ERROR type 1");
		break;
	case run:
		fprintf(stderr,"ERROR type 2");
		break;
	default:
		break;
	}
}




分享到:
评论
2 楼 shizheng0124 2012-11-22  

不错吧
1 楼 shizheng0124 2012-10-04  

hahhaahaha

相关推荐

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    也可以作为学习过C语言程序设计的人士继续深造的理想读物,也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考资料,同时也为那些准备参加与算法和数据结构相关的面试的...

    C语言常用算法

    094 求π的近似值 095 奇数平方的有趣性质 096 角谷猜想 097 四方定理 098 卡布列克常数 099 尼科彻斯定理 100 扑克牌自动发牌 101 常胜将军 102 搬山游戏 103 兔子产子(菲波那契数列) 104 数字移动 105 ...

    数独自动计算及自动生成不同难易程度题目的源码

    3、求唯余法:对于存在多个可能值的空格,循环取其中一个作为假设值,然后反复利用方法1和方法2去测试,如果出错冲突或导致别的空格无值可填时,说明假设的值是错误的。并对别剩余未找到唯一值的空格进行同样操作,...

    《计算机操作系统》期末复习指导

    (2)产生死锁的四个必要条件是资源互斥使用、保持和等待、非剥夺性、循环等待。 (3)解决死锁的方法 一般有死锁的预防,即破坏产生死锁的四个必要条件中的一个或多个,使系统绝不会进入死锁状态;死锁...

    软件工程-理论与实践(许家珆)习题答案

    判定表的优点是容易转换为计算机实现,缺点是不能够描述组合条件。(×) 7. 需求分析的主要方法有SD法、OOA法及HIPO法等。(×) 8. 分层的DFD图可以用于可行性分析阶段,描述系统的物理结构。(×) 9. 信息建模方法...

    超级有影响力霸气的Java面试题大全文档

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    国家集训队2019论文集.zip

    求出一个数刎的最短线性递推式 我们先考虑有限数列的情况,即我们要对个有限数列求出最短线性递推式。假设运 算均在一个域上进行。 种简单的做法是使用高斯消元消元出最短线性递推式,对于长度为n的有限数列复 杂...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    网络安全作业.doc

    2.AES算法的每轮变换由四种不同的变换组合而成,它们分别是S- 盒变换、行位移变换、列混合变换和圈密钥减法变换。 3.hash函数的特点是:已知M时,利用h(M)计算出h。已知h时,要想从h(M)计算出M也很 容易。 4....

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    5.4 Firefighters 表达式求值 135 6.博弈 139 6.1 博弈的AB剪枝 139 6.1.1 取石子 139 6.2 博弈 SG函数 局势分割 141 7.数据结构 142 7.1 TRIE 142 7.2 线段树 147 7.3 并查集 151 7.4 树状数组 152 7.5 点树 154 ...

    vc++ 开发实例源码包

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    vc++ 应用源码包_1

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_2

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_6

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_5

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_3

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

Global site tag (gtag.js) - Google Analytics