算法之枚举法

来源:互联网 发布:皇冠接水程序源码论坛 编辑:程序博客网 时间:2024/05/19 06:46
枚举算法(穷举):就是从所有候选答案中去搜索正确的解,使用该算法需要满足的两个条件:
1、可预先确定候选答案的数量
2、候选答案的范围在求解之前必须有一个确定的集合
--------------------------------------------------------------
填数游戏
 12345
X    1
-----------
 555555 
----------------------------------------
第一位范围在1-9
其余四位在0-9
乘数在1-9且等于第一位
结果=i5i5i5i5i5i5
---------------------------
见4.c++
--------------------------------------

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i1,i2,i3,i4,i5;
    long result,other;
    for(i1=1;i1<10;i1++)
    {
        for(i2=0;i2<10;i2++)
        {
            for(i3=0;i3<10;i3++)
            {
                 for(i4=0;i4<10;i4++)
                {
                            for(i5=0;i5<10;i5++)
                            {
                                   other = i1*10000+i2*1000+i3*100+i4*10+i5;
                                     result = i5*100000+i5*10000+i5*1000+i5*100+i5*10+i5;
                                     if(other*i1==result)
                                     {
                                          printf("\n%d%d%d%d%d\n",i1,i2,i3,i4,i5);
                                          printf("X%4d\n",i1);
                                          printf("------------\n");
                                          printf("%d",result);               
                                     }           
                            }        
                }               
            }                
        }
    }
    system("pause");
    return 0;
    }


-----------------------------------------

填运算符
5 5 5 5 5 =5(5+5-5*5/5=5)
求出所有运算符组情况?
注意:当填入除号时,要求右侧的数不能为0
乘除的运算级别比加减高
见5.c++

-----------------------------------------


#include<stdio.h>
#include<stdlib.h>
int main(){
    int j,i[5];//循环变量,数组i用来表示4个运算符1-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/ 
     {
         //排除 符号为'/' 右边数为0 
         //num[1] i[1] num[2] i[2] num[3] i[3] num[4] i[4] num[5]
         //i数组中运算符可为任意符号 所以,要四个嵌套循环 
         if(i[1]<4 || num[2]!=0)
         {
            for(i[2]=1;i[2]<=4;i[2]++)//2层 
            {
               if(i[2]<4 || num[3]!=0)
                 {
                    for(i[3]=1;i[3]<=4;i[3]++)//3层 
                    {
                        if(i[3]<4 || num[4]!=0)
                         {
                            for(i[4]=1;i[4]<=4;i[4]++)//4层 
                            {
                                   if(i[4]<4 || num[5]!=0)
                                    {  
                                       //先假想第一个数左边为0 
                                       left=0;
                                       right=num[1];
                                       sign=1;
                                       //到此i数组值已确定,一种情况,循环四次计算结果 
                                       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;
                                             case '*':
                                                  right=right*num[j+1];
                                                  break;
                                             case '/':
                                                  right=right/num[j+1];              
                                        }
                                       }//for结束
                                       //获取结果 
                                       if(left+right*sign==result)
                                       {
                                        count++;
                                        printf("%d,",count);
                                        for(j=1;j<=4;j++)
                                        {
                                         printf("%d%c",num[j],oper[i[j]]);
                                        }
                                        printf("%d=%d\n",num[5],result);
                                       } 
                                    }    
                            }
                         }             
                    }
                 }              
            }
         }                                                                                                                  
     } 
     system("pause");
    return 0;
 }


0 0
原创粉丝点击