大数減算(A-B Problem Plus)問題

37647 ワード

文書ディレクトリ
  • 1.解題構想
  • 1.1 flag==0で表される数Aが正の整数、数Bが正の整数
  • である.
  • 1.2 flag==1で表される数Aが負の整数、数Bが負の整数
  • である.
  • 1.3 flag==1で表される数Aが負の整数、数Bが正の整数
  • である
  • 1.4 flag==2で表される数Aが正の整数、数Bが負の整数
  • である
  • 2.サンプル
  • 3.コード実装
  • 1.解題の考え方
    flagAが0であることはAが正の整数であり、−1であることはAが負の整数であることを示す.
    flagBが0であることはBが正の整数であり、2であることはBが負の整数であることを示す.
    flag=flagA+flagBです.
    1.1 flag==0が数Aを正の整数とし、数Bが正の整数とする
    A-Bは正の整数または負の整数である可能性があります.
    1.2 flag==1で表される数Aが負の整数、数Bが負の整数
    A-Bは正の整数または負の整数である可能性があります.
    差分値は正の整数、負の整数のいずれかになりますので、次の方法を使用します.
    (1)まず,被減数と減数のどちらの桁数かを判断する.減数された桁数が正常な減算であれば.減数桁数
    (2)2桁の桁数が等しい場合、どの桁数より大きいかが望ましい.そうしないと、負の符号処理が煩雑になる.各項目を処理する場合、前一位が減算されて借位がある場合は、まず上一位の借位を減算し、見られない場合は減算しないで、被減算数を減算できるかどうかを判断し、減算できない場合は借位を減算してから減算し、同時に借位を1とし、そうでない場合は借位を0とする.
    1.3 flag==1で表される数Aが負の整数、数Bが正の整数
    A-Bは必ず負の整数です.
    計算時に数字がマイナスを除いたので、できれば先に加算し、最後にマイナスを加算します.
    -3-18のように、3+18=21で、マイナス記号を付けて-21です.
    1.4 flag==2で表される数Aが正の整数、数Bが負の整数
    A-Bは必ず正の整数である.
    計算時に数字にマイナス記号が付いていないため、直接加算できます.
    3-(-18)のように、3+18=21です.
    2.サンプル
    入力1:
    -3 98
    

    出力1:
    -3 - 98 = -101
    

    入力2:
    -3 -98
    

    出力2:
    -3 - (-98) = 95
    

    入力3:
    3 98
    

    出力3:
    3 - 98 = -95
    

    3.コード実装
    #include
    #include
    #define NUM_MAX 1000                //        
    
    /*
         
       :
     numA      
     numB      
     difference          :numA - numB = difference
     lenA char     
     lenB char     
     flag -1  A    、B    , 0  A B     ,
      1  A B     , 2  A    、B    
        :    difference     ,        
     */
    
    void Minus(char* numA, char* numB, int* difference, int lenA, int lenB, int flag)
    {
        char* temp = NULL;
        int symbol = 0;                             // symbol 0          , 1        
        int tempFlag = 0;                           //     
        
        int maxLen = lenA > lenB ? lenA : lenB;     //     numA numB     
        
        // flag == 0    A    , B    , A - B           
        // flag == 1    A    , B    , A - B           
        if (flag == 0 || flag == 1)
        {
            //            
            if (lenA < lenB)
            {
                tempFlag = 1;
                //     ,    
                temp = numA;
                numA = numB;
                numB = temp;
                
                maxLen = lenA;
                lenA = lenB;
                lenB = maxLen;
            }
            else if (lenA == lenB)                  //               
            {
                for (int i = 0; i < lenA; i++)
                {
                    if (numA[i] == numB[i])
                    {
                        continue;
                    }
                    else if (numA[i] > numB[i])
                    {
                        tempFlag = 0;
                        break;
                    }
                    else
                    {
                        tempFlag = 1;
                        temp = numA;
                        numA = numB;
                        numB = temp;
                        break;
                    }
                }
            }
        }
        
        
        //  A B     
        if (flag == 0)
        {
            if (tempFlag == 0)
            {
                symbol = 0;
            }
            else
            {
                symbol = 1;
            }
        }
        else if (flag == 1)                         //  A B     
        {
            if (tempFlag == 0)
            {
                symbol = 1;
            }
            else
            {
                symbol = 0;
            }
        }
        else if (flag == -1)                        //  A    , B    , A - B       
        {
            symbol = 1;
        }
        else                                        // flag == 2   A    , B    , A - B       
        {
            symbol = 0;
        }
        
        int l = 0;
        int k = 0;
        int array[NUM_MAX] = {0};
        
        //  numA                ,          sum ,     ,    
        for (int i = lenA - 1; i >= 0; i--)
        {
            difference[k++] = numA[i] - '0';               //     '9' - '0' = 9               
        }
        
        //       
        for (int j = lenB - 1; j >= 0; j--)
        {
            array[l++] = numB[j] - '0';
        }
        
        //     
        // flag == 0    A    , B    , A - B           
        // flag == 1    A    , B    , A - B           
        //            :    A  B   ,      ,                
        //   ,            
        
        // flag == -1    A    , B    , A - B       
        //            ,    A + B  ,            
        //  -3 - 8,    3 + 8 = 11,     , -11
        
        // flag == 2    A    , B    , A - B       
        //            ,   A + B  
        //  3 - (-8),    3 + 8 = 11,     
        for (int i = 0; i <= maxLen; i++)
        {
            if (flag == 0 || flag == 1)
            {
                difference[i] -= array[i];             //           
                if (difference[i] < 0)                 //        
                {
                    difference[i] += 10;
                    difference[i+1]--;
                }
            }
            else if (flag == -1 || flag == 2)
            {
                difference[i] += array[i];             //           
                if (difference[i] > 9)                 //        
                {
                    difference[i] %= 10;
                    difference[i+1]++;
                }
            }
            
        }
        
        //        
        if (symbol == 1)
        {
            //   maxLen - 1   
            if(difference[maxLen] == 0)
            {
                //         -1     
                difference[maxLen] = -1;
                maxLen++;
            }
            else                                //   maxLen - 1  
            {
                //         -1     
                difference[maxLen + 1] = -1;
                maxLen = maxLen + 1 + 1;
            }
        }
        else                                    //        
        {
            if(difference[maxLen] == 0)
            {
                maxLen++;
            }
            else
            {
                maxLen = maxLen + 1 + 1;
            }
        }
        
        int i = 0;
        
        //        -1       
        if (difference[i = maxLen - 1] < 0)
        {
            printf("-");                        //     
            i--;
        }
        else
        {
            i = maxLen;
        }
        
        //    0     ,      0      
        while (difference[i] == 0)
        {
            i--;
        }
        
        //       
        for ( ; i >= 0; i--)
        {
            printf("%d", difference[i]);
        }
        
    }
    
    int main()
    {
        char strA[NUM_MAX] = {0};
        char strB[NUM_MAX] = {0};
        
        while (scanf("%s%s", strA, strB) != EOF)
        {
            char numA[NUM_MAX] = {0};
            char numB[NUM_MAX] = {0};
            int difference[NUM_MAX] = {0};      //        ,    ,    , sum[0]   
            int flag = 0;
            int flagA = 0;                      // flagA 0  A    , -1  A    
            int flagB = 0;                      // flagB 0  B    , 2  B    
            int lenA = strlen(strA);            //     numA   ,  A   
            int lenB = strlen(strB);            //     numB   ,  B   
            
            //     ,    ,          1
            if (strA[0] == '-')
            {
                flagA = -1;
                lenA--;
            }
            if (strB[0] == '-')
            {
                flagB = 2;
                lenB--;
            }
            
            // flag -1  A    、B    , 0  A B     ,
            //  1  A B     , 2  A    、B    
            flag = flagA + flagB;
            
            //  strA strB        numA numB    ,                
            for (int i = lenA - 1; i >= 0; i--)
            {
                if (flagA == -1)
                {
                    numA[i] = strA[i+1];
                }
                else
                {
                    numA[i] = strA[i];
                }
            }
            
            for (int j = lenB - 1; j >= 0; j--)
            {
                if (flagB == 2)
                {
                    numB[j] = strB[j+1];
                }
                else
                {
                    numB[j] = strB[j];
                }
            }
            
            if (flagB == 2)
            {
                printf("%s - (%s) = ", strA, strB);
            }
            else
            {
                printf("%s - %s = ", strA, strB);
            }
            
            //         
            Minus(numA, numB, difference, lenA, lenB, flag);
            
            //   
            printf("
    "
    ); } return 0; }

    個人用ページ:
    www.codeapes.cn