枚举算法

枚举算法的特点

枚举算法的思想是:将问题的所有可能的答案一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。看下的问题:

找出1~100 之间的素数,需要将1~100 之间的所有整数进行判断。因为枚举算法要列举问题的所有可能的答案,所以应具备以下3 个特点:

(1)得到的结果肯定是正确的。

(2) 可能做了很多的无用功,浪费了宝贵的时间,效率低下。

(3) 通常会涉及求最大值和最小值的问题。

 算法思路

枚举法常被称为穷举法,是指从可能的集合中一一枚举各个元素,用题月给定的约束条判定哪些是无用的,哪些是有用的。能使命题成立者即为问题的解。枚毕算法一般使用while循环实现。
采用枝举算法解题的基本思路如下:

(1)确定校举对象、枚举范围和判定条件。     (2)一一枚举可能的解,验证是否是问题的解。
下面将从枚举算法优化、枚举对象选择以及判定条件确定这3个方面来探讨如何用枚举法解题。枚举算法般按照如下3步进行:
枚举值符合给
(1)题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。
(2)判断是否是真正解的条件。
(3)使可能解的范围降至最小,以便提高解决问题的效率。

百钱买百鸡

 我国古代数学家在《算经》中有一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、维各几何?”意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡,母鸡,小鸡各多少?


#include<stdio.h>
void main()
{
    int x,y,z;
	for(x=0;x<=20;x++){
	     for(y=0;y<=33;y++){
		      z=100-x-y;
			  if(z%3==0&&x*5+y*3+z/3==100)
			    printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);
		 }
	}
}

填写运算符

在下面的算式中,添加"+" "-" "*" "/" 4个运算符,使等式成立。

 算法分析: 上还算式由5 个数字构成,一共需要填入4个运算符。并且每两个数字之间的运算符有4 种选择,分别是“+”、“-”、“*”、“/”。在编程中,可以通过循环来填入各种运算符,然后再判断算式是否成立。需要保证当填入除号时,其右侧的数不可能是0,并且"*”、“/”运算符的优先级高于“+”、“-”。 

#include<stdio.h>
void main()
{
   int j,i[5]; //循环变量,数组i用来表示4个运算符
   int sign;  //累加运算时的符号
   int result;  //保存运算式的结果值
   int count=0; //计算器,统计符合条件的方案
   int num[6];   //保存操作数 
   float left,right; //保存中间结果
   char oper[5]={' ','+','-','*','/'};
   printf("请输入5个数:");
   for(j=1;j<=5;j++){
          scanf("%d",&num[j]);
   }
   printf("请输入结果:");
   scanf("%d",&result);
   for(i[1]=1;i[1]<=4;i[1]++){   //循环4种运算符,1表示+,2表示-,3表示*,4表示/
        if((i[1]<4)||(num[2]!=0)){ //运算符若是/,则第二个运算符不能为0
            for(i[2]=1;i[2]<=4;i[2]++){ 
			    if((i[2]<4)||(num[3]!=0)){
                   	for(i[3]=1;i[3]<=4;i[3]++){ 
                       if((i[3]<4)||(num[4]!=0)){
                          for(i[4]=1;i[4]<=4;i[4]++){
						     if((i[4]<4)||(num[5]!=0)){
							     left=0;
								 right=num[1];
								 sign=1;
								 for(j=1;j<=4;j++){
								    switch(oper[i[j]]){
									  case '+':
									           left=left+sign*right;
											   sign=1;
											   right=num[j+1];
											   break;
									  case '-':
									           left=left+sign*right;
											   sign=-1;
											   right=num[j+1];
											   break;//通过f=-1实现减法
									  case '*':
                                               right=right*num[j+1];
                                               break; //实现乘法
                                      case '/':
                                               right=right/num[j+1]; //实现除法
                                               break;											   
									}   
								 }
								 if(left+sign*right==result)
								 {
								     count++;
									 printf("%3d: ",count);
									 for(j=1;j<=4;j++){
                                         printf("%d%c",num[j],oper[i[j]]);										 
									  }
									  printf("%d=%d\n",num[5],result);
								 }
							 }
						  }					   
					   }                 
					 }					
				}
			}		 
		 }
   }
   if(count==0){
       printf("没有符合要求的方法!\n");
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值