程序主要要求 主程序读入两个字符串类型的大数(小数),通过函数实现小数的高精度减法。求完整的代码和注释,比较急,谢谢
6条回答 默认 最新
关注 你这是什么编辑器啊。连作用域都不分,我把变量名都改了,代码如下:
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥50 汇编语言除法溢出问题
- ¥65 C++实现删除N个数据列表共有的元素
- ¥15 Visual Studio问题
- ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
- ¥20 求一个html代码,有偿
- ¥100 关于使用MATLAB中copularnd函数的问题
- ¥20 在虚拟机的pycharm上
- ¥15 jupyterthemes 设置完毕后没有效果
- ¥15 matlab图像高斯低通滤波
- ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗