迭代算法

转自:https://blog.csdn.net/qq_41398448/article/details/80273541

枚举算法的特点

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

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

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

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

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

 算法思路

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

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

百钱买百鸡

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


[html]  view plain  copy
  1. #include<stdio.h>  
  2. void main()  
  3. {  
  4.     int x,y,z;  
  5.     for(x=0;x<=20;x++){  
  6.          for(y=0;y<=33;y++){  
  7.               z=100-x-y;  
  8.               if(z%3==0&&x*5+y*3+z/3==100)  
  9.                 printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);  
  10.          }  
  11.     }  
  12. }  

填写运算符

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

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

[html]  view plain  copy
  1. #include<stdio.h>  
  2. void main()  
  3. {  
  4.    int j,i[5]; //循环变量,数组i用来表示4个运算符  
  5.    int sign;  //累加运算时的符号  
  6.    int result;  //保存运算式的结果值  
  7.    int count=0; //计算器,统计符合条件的方案  
  8.    int num[6];   //保存操作数   
  9.    float left,right; //保存中间结果  
  10.    char oper[5]={' ','+','-','*','/'};  
  11.    printf("请输入5个数:");  
  12.    for(j=1;j<=5;j++){  
  13.           scanf("%d",&num[j]);  
  14.    }  
  15.    printf("请输入结果:");  
  16.    scanf("%d",&result);  
  17.    for(i[1]=1;i[1]<=4;i[1]++){   //循环4种运算符,1表示+,2表示-,3表示*,4表示/  
  18.         if((i[1]<4)||(num[2]!=0)){ //运算符若是/,则第二个运算符不能为0  
  19.             for(i[2]=1;i[2]<=4;i[2]++){   
  20.                 if((i[2]<4)||(num[3]!=0)){  
  21.                     for(i[3]=1;i[3]<=4;i[3]++){   
  22.                        if((i[3]<4)||(num[4]!=0)){  
  23.                           for(i[4]=1;i[4]<=4;i[4]++){  
  24.                              if((i[4]<4)||(num[5]!=0)){  
  25.                                  left=0;  
  26.                                  right=num[1];  
  27.                                  sign=1;  
  28.                                  for(j=1;j<=4;j++){  
  29.                                     switch(oper[i[j]]){  
  30.                                       case '+':  
  31.                                                left=left+sign*right;  
  32.                                                sign=1;  
  33.                                                right=num[j+1];  
  34.                                                break;  
  35.                                       case '-':  
  36.                                                left=left+sign*right;  
  37.                                                sign=-1;  
  38.                                                right=num[j+1];  
  39.                                                break;//通过f=-1实现减法  
  40.                                       case '*':  
  41.                                                right=right*num[j+1];  
  42.                                                break; //实现乘法  
  43.                                       case '/':  
  44.                                                right=right/num[j+1]; //实现除法  
  45.                                                break;                                                
  46.                                     }     
  47.                                  }  
  48.                                  if(left+sign*right==result)  
  49.                                  {  
  50.                                      count++;  
  51.                                      printf("%3d: ",count);  
  52.                                      for(j=1;j<=4;j++){  
  53.                                          printf("%d%c",num[j],oper[i[j]]);                                         
  54.                                       }  
  55.                                       printf("%d=%d\n",num[5],result);  
  56.                                  }  
  57.                              }  
  58.                           }                      
  59.                        }                   
  60.                      }                    
  61.                 }  
  62.             }          
  63.          }  
  64.    }  
  65.    if(count==0){  
  66.        printf("没有符合要求的方法!\n");  
  67.    }  
  68. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值