24点的筛选

//
// main.c
// Zhu
//
// Created by teacher on 17-7-11.
// Copyright (c) 2017年 teacher. All rights reserved.
// 学员:杨**
//
#include <stdio.h>
#pragma 计算调用
/*
由传入的运算符判断运算方式"'+','-','*','/'"
*/
int count (int a,int b,char c){
//判断运算符
switch (c)
{
//判断a或b等于或小于0的情况
case '+':
if(a>0&&b>0&&a+b>0){
return a+b;
}else{
return 0;
}
break;
//判断a或b等于或小于0的情况
case '-':
if(a>0&&b>0&&a-b>0){
return a-b;
}else{
return 0;
}
break;
//判断a或b等于或小于0的情况
case '*':
if(a>0&&b>0&&a*b>0){
return a*b;
}else{
return 0;
}
break;
//判断a或b等于或小于0的情况
case '/':
if(a>0&&b>0&&a/b>0){
return a/b;
}else{
return 0;
}
break;
}
return 0;
}
#pragma 判断括号的位置
/*
"?"代表运算符。
a,b,c,d分别代表第一个数,第二个数,第三个数及第四个数。

第一种情况((a?b)?c)?d;
*/
int judge1(int num1,int num2,int num3,int num4,char fu1,char fu2,char fu3){
int jie1=0,jie2=0,jie3=0;
jie1=count(num1,num2,fu1);
jie2=count(jie1,num3,fu2);
jie3=count(jie2,num4,fu3);
if(jie3==24){
return jie3;
}
return 0;
}
/*
第二种情况(a?(b?c))?d;
*/
int judge2(int num1,int num2,int num3,int num4,char fu1,char fu2,char fu3){
int jie1=0,jie2=0,jie3=0;
jie1=count(num2,num3,fu2);
jie2=count(num1,jie1,fu1);
jie3=count(jie2,num4,fu3);
if(jie3==24){
return jie3;
}
return 0;
}
/*
第三种情况a?(b?(c?d));
*/
int judge3(int num1,int num2,int num3,int num4,char fu1,char fu2,char fu3){
int jie1=0,jie2=0,jie3=0;
jie1=count(num3,num4,fu3);
jie2=count(num2,jie1,fu2);
jie3=count(num1,jie2,fu1);
if(jie3==24){
return jie3;
}
return 0;
}
/*
第四种情况a?((b?c)?d);
*/
int judge4(int num1,int num2,int num3,int num4,char fu1,char fu2,char fu3){
int jie1=0,jie2=0,jie3=0;
jie1=count(num2,num3,fu2);
jie2=count(jie1,num4,fu3);
jie3=count(num1,jie2,fu1);
if(jie3==24){
return jie3;
}
return 0;
}
/*
第五种情况(a?b)?(c?d)
*/
int judge5(int num1,int num2,int num3,int num4,char fu1,char fu2,char fu3){
int jie1=0,jie2=0,jie3=0;
jie1=count(num1,num2,fu1);
jie2=count(num3,num4,fu3);
jie3=count(jie1,jie2,fu2);
if(jie3==24){
return jie3;
}
return 0;
}
#pragma 循环判断计算
void pandaun(int num[],int N){
//定义运算符数组
char fu[4]={'+','-','*','/'};
int num1,num2,num3,num4,fu1,fu2,fu3;

for ( num1=0;num1<4;num1++)
{
for( fu1=0;fu1<3;fu1++)
{
for ( num2=0;num2<4;num2++)
{
//判断不能重复使用第一个数
if(num[num1]!=num[num2])
{
for ( fu2=0;fu2<4;fu2++)
{
for ( num3=0;num3<4;num3++)
{
//判断不能重复使用第一个数和第二个数
if(num[num1]!=num[num2]&&num[num1]!=num[num3]&&num[num2]!=num[num3])
{
for ( fu3=0;fu3<4;fu3++)
{
for ( num4=0;num4<4;num4++)
{
//判断不能重复使用第一个数和第二个数及第三个数
if(num[num1]!=num[num2]&&num[num1]!=num[num3]&&num[num2]!=num[num3]&&num[num1]!=num[num4]&&num[num2]!=num[num4]&&num[num3]!=num[num4])
{
/*5种计算结果判断显示*/
if(judge1(num[num1],num[num2],num[num3],num[num4],fu[fu1],fu[fu2],fu[fu3])==24){
printf("((%d%c%d)%c%d)%c%d=24\n",num[num1],fu[fu1],num[num2],fu[fu2],num[num3],fu[fu3],num[num4]);
}
if(judge2(num[num1],num[num2],num[num3],num[num4],fu[fu1],fu[fu2],fu[fu3])==24){
printf("(%d%c(%d%c%d))%c%d=24\n",num[num1],fu[fu1],num[num2],fu[fu2],num[num3],fu[fu3],num[num4]);
}
if(judge3(num[num1],num[num2],num[num3],num[num4],fu[fu1],fu[fu2],fu[fu3])==24){
printf("%d%c(%d%c(%d%c%d))=24\n",num[num1],fu[fu1],num[num2],fu[fu2],num[num3],fu[fu3],num[num4]);
}
if(judge4(num[num1],num[num2],num[num3],num[num4],fu[fu1],fu[fu2],fu[fu3])==24){
printf("%d%c((%d%c%d)%c%d)=24\n",num[num1],fu[fu1],num[num2],fu[fu2],num[num3],fu[fu3],num[num4]);
}
if(judge5(num[num1],num[num2],num[num3],num[num4],fu[fu1],fu[fu2],fu[fu3])==24){
printf("(%d%c%d)%c(%d%c%d)=24\n",num[num1],fu[fu1],num[num2],fu[fu2],num[num3],fu[fu3],num[num4]);
}

}
}
}
}
}
}
}
}
}
}
}
#pragma 函数开始点
int main(int argc, const char * argv[]) {
int i, shu,num[4],k=sizeof(num)/sizeof(int);
//游戏初始界面
printf("--------------------------------------------------------------------------------\n");
printf("================================================================================\n");
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf("※※※※卍卍卍卍卍※※※※\t24 点 游 戏 \t※※※※卍卍卍卍卍※※※※\n");
printf("☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
printf("================================================================================\n");
printf("--------------------------------------------------------------------------------\n");
printf("\n");
//循环提示输入
for ( i=0;i<k;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&shu);

if (shu<10&&shu>0)
{
num[i]=shu;
}else
{
i--;
printf("输入的数字不能大于“10”或者等于“0”\n");
}
}
printf("你输入的数字为:");
for(i=0;i<k;i++){
printf("%d",num[i]);
}
printf("\n");
printf("\n");
//开始调用循环
pandaun(num,4);
return 0;
}

/*

  24点,核心在于如何将要优先计算的括号()转换成计算机可以识别步骤以及每一个括号计算后值得判断,

其中在判断得步骤中可以优先考虑使用for循环代替if判断语句,可以提高整个程序的执行速度。在计算结束后

的输出阶段,也是需要很强逻辑把计算的每一种情况或者每一种运算方式排序赋值再输出。

  做完24点,理论上可以将开发者的for循环,if语句以及整个程序的结构逻辑提升一个等级。代码本身的意

义很小,重要的是整个程序执行流程的分析和实现。

*/

原文地址:https://www.cnblogs.com/robotes/p/7216648.html