天天看點

枚舉小結

一想到枚舉,就是暴力,近日在看算法書,感覺厘清思想比較重要,是以來寫下一點自己的感想。

例題:

在 a  b  c  d  e  = f  (a~f為0~9))  中添加+、-、*、/ 号來使得等式成立。

分析該式子,由5個數構成的算式,一共需要填入4個運算符,注意點:

1、除法分母不為0 

2、乘除法運算級别優先于加減法

思路: 兩個變量 left 和 right 分别儲存上次運算結果(下次運算的左側内容)和下次參加運算的資料(下次運算的右側内容)

           比如 5 + 5 - 5 * 5 / 5 = 5,left = 5 + 5   right = 5 * 5 / 5

枚舉小結
#include <cstdio>
#include <cstring> 
char op[5]={' ','+','-','*','/'};
int num[10];
int main()
{
	int i[5],j,temp,result,ans=0;
	printf("請輸入5個數:");
	for(j=1;j<=5;j++)
	  scanf("%d",&num[j]);
    printf("請輸入結果:");
    scanf("%d",&result);
    double left,right;
    for(i[1]=1;i[1]<=4;i[1]++) //循環四種運算符,1表示 +,2表示 —,3表示 *,4表示 / 
	{      
		if(i[1]<4 || num[2]!=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];
		 							temp=1;
		 							for(j=1;j<=4;j++)
		 							{
							 			switch(op[i[j]])
							 			{
			 								case '+':
			 								     left=left+temp*right;
			 								     temp=1;
			 								     right=num[j+1];
			 								     break;
							                case'-':
							                     left=left+temp*right;
							                     temp=-1;
							                     right=num[j+1];
							                     break;
		                                    case'*':
							                     right=right*num[j+1];
							                     break;
		                                    case'/':
							                     right=right/num[j+1];
							                     break;
			 							}
							 		}
							 		if(left+temp*right==result)
							 		{
		 								ans++;
		 								printf("%3d: ",ans);
		 								for(j=1;j<=4;j++)
		 								{
								 			printf("%d%c",num[j],op[i[j]]);
								 		}
								 		printf("%d=%d\n",num[5],result);
		 							}
		 						}
						 	}
	 					}
				    }
		      }	
   		   }	
		}
	} 
    if(ans==0)printf("沒有符合要求的方法\n");
	return 0; 
}
           

繼續閱讀