移动火柴棒判断等式是否成能成立

Posted 时令

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动火柴棒判断等式是否成能成立相关的知识,希望对你有一定的参考价值。

 

1: 从键盘读入一个式子(该式子肯定是一个不成立的等式)。 
2:判断,是否可以移动一根木棒可以使等式成立,则输出新的等式,否则输出No。 

a.式子中的数只能是正数,运算符号只会出现加号和减号,并且有且仅有一个等号,不会出现括号、乘号或除号,也不会有++,--,+-或-+出现。 
b.式子中只能是整数,并且小于10
c.你不能移动=的木棒,所以加号、减号、等号是不会改变的。移动前后,木棒构成的数字必须严格与计算机器中显示的效果一致。 
d.从键盘读入的式子中的数不会以0开头,但允许修改后等式中的数以数字为开头。 

#include <stdio.h>  
  
/* 定义操作符号,"+"或"-" */  
#define SYMBOL_ERROR 0  
#define SYMBOL_ADD   1  
#define SYMBOL_MINUS 2  
  
/* 定义变化标识,取值原则:3个中随便取出n个相加不能等于其中一个数 */  
#define FLAG_NO    0     /* 没有移动 */  
#define FLAG_MINUS 10    /* 去一根火柴 */  
#define FLAG_ADD   100   /* 增加一根火柴 */  
#define FLAG_SELF  1000  /* 拿一根放自己身上另外的位置 */  
  
/* 定义合法移动 */  
#define MOVE_TO_ANOTHER 110   /* 10 + 100 + 0,一个数拿一根,放到另一个数上 */  
#define MOVE_TO_SELF    1000  /* 1000 + 0 + 0,自己拿一根放自己身上其他位置 */  
#define MOVE_FROM_PLUS  100   /* 100 + 0 + 0,从加号上拿一根放一个数身上 */  
  
/* 定义火柴移动结构体 */  
typedef struct matchstick  
{  
    int iFlag; /* 变化标识 */  
    int iData; /* 火柴表示的数 */  
}MATCH_STICK_S;  
  
/*  
  获取一个数不动或移动一根火柴后得到的数(只列举3和6,其他数值类似) 
  入参:指定的数(0-9) 
  出差:MATCH_STICK_S结构数组 
  返回值:移动一根火柴得到的数的个数 
*/  
int getDataAfterMoveStick(int iData, MATCH_STICK_S *pstStick)  
{  
    int iCount = 0;  
      
    switch(iData)  
    {  
        case 3:  
        {  
            pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 3;   /* 不动 */  
            pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 9;  /* 加一根 */  
            pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 2; /* 自己移动一根 */  
            pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 3;  
            pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 5;  
            iCount = 5;  
            break;  
        }  
        case 6:  
        {  
            pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 6;    /* 不动 */  
            pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 8;   /* 加一根 */  
            pstStick[5].iFlag = FLAG_MINUS; pstStick[5].iData = 5; /* 减一根 */  
            pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 0;  /* 自己移动一根 */  
            pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 6;  
            pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 9;              
            iCount = 6;  
            break;  
        }  
        default:  
        {  
            break;  
        }  
    }  
      
    return iCount;  
}  
  
/* 移动火柴 
   返回值: 
   SYMBOL_ERROR:非法移动 
   SYMBOL_MINUS:从"+"上取一根加到某个数上 
   SYMBOL_ADD:  不从"+"取火柴时,移动一根 
 */  
char checkStickMove(int iFlag1, int iFlag2, int iFlag3)  
{  
    char cSymbol = SYMBOL_ERROR;  
    int iFlagSum = iFlag1 + iFlag2 + iFlag3;  
      
    if((MOVE_TO_ANOTHER == iFlagSum) || (MOVE_TO_SELF == iFlagSum))  
    {  
        cSymbol = SYMBOL_ADD;  
    }  
    else if(MOVE_FROM_PLUS == iFlagSum)  
    {  
        cSymbol = SYMBOL_MINUS;  
    }  
      
    return cSymbol;  
}  
  
/* 满足移动规则,并能使等式成立的,打印出来 */  
void printResult(MATCH_STICK_S *pstStick1, MATCH_STICK_S *pstStick2, MATCH_STICK_S *pstStick3)  
{  
    int iFlag1 = pstStick1->iFlag;  
    int iFlag2 = pstStick2->iFlag;  
    int iFlag3 = pstStick3->iFlag;  
    int iData1 = pstStick1->iData;  
    int iData2 = pstStick2->iData;  
    int iData3 = pstStick3->iData;  
      
    char cSymbol = checkStickMove(iFlag1, iFlag2, iFlag3);  
      
    if((SYMBOL_ADD == cSymbol) && (iData3 == iData1 + iData2))  
    {  
        printf("%d + %d = %d\\n", iData1, iData2, iData3);  
    }  
    else if((SYMBOL_MINUS == cSymbol) && (iData3 == iData1 - iData2))  
    {  
        printf("%d - %d = %d\\n", iData1, iData2, iData3);  
    }  
      
    return;  
}  
  
/* 处理火柴移动 */  
void dealStickMove(int iData1, int iData2, int iData3)  
{  
    unsigned long ulLoop1, ulLoop2, ulLoop3;     
    int iCount1, iCount2, iCount3;  
    MATCH_STICK_S astStick1[10];  
    MATCH_STICK_S astStick2[10];  
    MATCH_STICK_S astStick3[10];  
      
    iCount1 = getDataAfterMoveStick(iData1, astStick1);  
    iCount2 = getDataAfterMoveStick(iData2, astStick2);  
    iCount3 = getDataAfterMoveStick(iData3, astStick3);  
      
    for(ulLoop1 = 0; ulLoop1 < iCount1; ulLoop1++)  
    {  
        for(ulLoop2 = 0; ulLoop2 < iCount2; ulLoop2++)  
        {  
            for(ulLoop3 = 0; ulLoop3 < iCount3; ulLoop3++)  
            {  
                printResult(&astStick1[ulLoop1], &astStick2[ulLoop2], &astStick3[ulLoop3]);  
            }  
        }  
    }  
  
    return;  
}  
  
int main()  
{  
    dealStickMove(3, 6, 3);  
      
    return 0;  
}  

 

以上是关于移动火柴棒判断等式是否成能成立的主要内容,如果未能解决你的问题,请参考以下文章

1168 火柴棒等式

P1149 火柴棒等式

关于经典题目火柴棒等式

二模08day1解题报告

P1149 火柴棒等式

P1149 火柴棒等式