S779876894N 2016-08-28 04:35 采纳率: 100%
浏览 2545
已采纳

c++高精度小数减法问题

程序主要要求 主程序读入两个字符串类型的大数(小数),通过函数实现小数的高精度减法。求完整的代码和注释,比较急,谢谢

  • 写回答

6条回答 默认 最新

  • AlbertS 博客专家认证 2016-08-28 07:15
    关注

    你这是什么编辑器啊。连作用域都不分,我把变量名都改了,代码如下:

    #include <iostream>
    using namespace std;
    #define MAX_NUMBER_LEN 1024
    
    bool isGreaterThan(const int* pNum1, const int* pNum2)
    {
        if (pNum1 == NULL || pNum2 == NULL)
        {
            cout << "您输入的数字有误" << endl;
            return false;
        }
    
        for(int nIndx = 0; nIndx < MAX_NUMBER_LEN; ++nIndx)
        {
            if (pNum1[nIndx] > pNum2[nIndx])
                return true;
        }
    
        return false;
    }
    
    int main()
    {
    
        char szNum1[1024] = {0};
        char szNum2[1024] = {0};
        int arNumber1[1024] = {0};
        int arNumber2[1024] = {0};
    
        cout << "请输入两个小数(小数位数不要超过500位),空格分隔:" << endl;
    
        cin >> szNum1;
        cin >> szNum2;
    
    
        // 把第一个字符串转化成数组
        int nCount = 0;
        int nNumLen = strlen(szNum1);
        bool bFindDot = false;
        for (int nIndex = 0, pos = nIndex + 1; nIndex < nNumLen; ++nIndex)
        {
            if (szNum1[nIndex] == '.')
            {
                bFindDot = true;
            }
            else
            {
                if(szNum1[nIndex] < '0' || szNum1[nIndex] > '9')
                {
                    cout << "请输入不是正确的数字" << endl;
                    return 0;
                }
                else
                {   
                    arNumber1[pos] = szNum1[nIndex] - '0';
                }
                pos++;
    
            }
    
            if (!bFindDot)
                nCount++;
        }
        arNumber1[0] = nCount;
    
    
    
    
        // 把第二个字符串转化成数组
        nCount = 0;
        nNumLen = strlen(szNum2);
        bFindDot = false;
        for (int nIndex1 = 0, pos = nIndex1 + 1; nIndex1 < nNumLen; ++nIndex1)
        {
            if (szNum2[nIndex1] == '.')
            {
                bFindDot = true;
            }
            else
            {
                if(szNum2[nIndex1] < '0' || szNum2[nIndex1] > '9')
                {
                    cout << "请输入不是正确的数字" << endl;
                    break;
                }
                else
                {   
                    arNumber2[pos] = szNum2[nIndex1] - '0';
                }
                pos++;
    
            }
    
            if (!bFindDot)
                nCount++;
        }
        arNumber2[0] = nCount;
    
    
        bool isGreater = isGreaterThan(arNumber1, arNumber2);
        // 比较小数前的位数
        if (arNumber1[0] != arNumber2[0])
        {
    
            int nshift = abs(arNumber1[0] - arNumber2[0]);
            int *pNum;
            int nTotal;
    
            if(isGreater)
            {
                pNum = arNumber2;
                nTotal = strstr(szNum2, ".") ? strlen(szNum2) - 1 : strlen(szNum2);
            }
            else
            {
                pNum = arNumber1;
                nTotal = strstr(szNum1, ".") ? strlen(szNum1) - 1 : strlen(szNum1);
            }
    
            for(int nIndex2 = nTotal; nIndex2 >= 0; --nIndex2)
            {
                pNum[nIndex2 + nshift] = pNum[nIndex2];
            }
    
            for(int nIndex2 = nshift; nIndex2 >= 1; --nIndex2)
            {
                pNum[nIndex2] = 0;
            }
        }
    
        // 做简单减法
        int nlen1 = strstr(szNum1, ".") ? strlen(szNum1) - 1 : strlen(szNum1);
        int nlen2 = strstr(szNum2, ".") ? strlen(szNum2) - 1 : strlen(szNum2);
        int forcount= nlen1 > nlen2 ?nlen1 : nlen2;
        if (isGreater)
        {
            for (int nIndex3 = 1; nIndex3 <= forcount; nIndex3++)
            {
                arNumber1[nIndex3] = arNumber1[nIndex3] - arNumber2[nIndex3];
            }
        }
        else
        {
            for (int nIndex4 = 1; nIndex4 <= forcount; nIndex4++)
            {
                arNumber1[nIndex4] = arNumber2[nIndex4] - arNumber1[nIndex4];
            }
    
        }
    
    
        // 处理减法中的负数
        arNumber1[0]  = arNumber1[0] > arNumber2[0] ? arNumber1[0] : arNumber2[0];
    
        for ( int nIndex5 = forcount; nIndex5 > 0; --nIndex5)
        {
            if (arNumber1[nIndex5] < 0)
            {
                arNumber1[nIndex5] += 10;
                arNumber1[nIndex5 - 1] -= 1;
            }
        }
    
    
        cout << "结果为" << endl;
        if (!isGreater)
            cout << "-";
    
    
        //输出结果
        bool zerooutpput = false;
        bool putpucount = 0;
        for( int nIndex6 = 1; nIndex6 <= forcount; nIndex6++ )
        {
            if (arNumber1[nIndex6] != 0 || nIndex6 > arNumber1[0])
            {
                zerooutpput = true;
                cout << arNumber1[nIndex6];
                putpucount++;
            }
            else if (zerooutpput)
            {
                cout << arNumber1[nIndex6];
                putpucount++;
            }
    
            if (nIndex6 == arNumber1[0])
            {
                if (putpucount == 0)
                    cout << "0";
    
                if (nIndex6 != forcount)
                    cout << '.';
            }
        }
    
    
        system("pause");
    
        return 0;
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥50 汇编语言除法溢出问题
  • ¥65 C++实现删除N个数据列表共有的元素
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗