zoukankan      html  css  js  c++  java
  • 移动火柴棒判断等式是否成能成立

    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
    ", iData1, iData2, iData3);  
        }  
        else if((SYMBOL_MINUS == cSymbol) && (iData3 == iData1 - iData2))  
        {  
            printf("%d - %d = %d
    ", 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;  
    }  
  • 相关阅读:
    Mysql任务调度
    使用 IntraWeb (18)
    使用 IntraWeb (17)
    替盛大代发的招聘启示
    使用 IntraWeb (16)
    使用 IntraWeb (15)
    使用 IntraWeb (14)
    使用 IntraWeb (13)
    使用 IntraWeb (12)
    使用 IntraWeb (11)
  • 原文地址:https://www.cnblogs.com/medicinebl/p/6182753.html
Copyright © 2011-2022 走看看