超长整数加法计算

来源:互联网 发布:新西兰网络无信号 编辑:程序博客网 时间:2024/04/29 15:25

对于long long类型也存放不下的超长整数,可以使用字符串模拟的办法来对其进行运算的模拟。此处仅做加法的示范,其他运算思想类似。

每四位视为一个整数,进位等情况对下一次的计算考虑影响。


#include<iostream>using namespace  std;#define  MAX_LEN 50int nNumA[MAX_LEN];int nLenA = 0;int nNumB[MAX_LEN];int nLenB = 0;int nResult[2*MAX_LEN];int nLenR = 0;void CharToInt(char *szSource, int *nDes, int *Len){int j = 0;int nDesLoc = 0;int nTotalNum = 0;int thisNum = 0; //当前char的值int nHead = strlen(szSource) % 4;if (nHead != 0){for (int k = 0; k< nHead; k++){thisNum = (int)(szSource[k] - '0') + 0;nTotalNum = nTotalNum*10 + thisNum;j++;}nDes[nDesLoc] = nTotalNum;  //数组开头不足四位nTotalNum = 0;j = 0;nDesLoc++;}for (int i= nHead; i<strlen(szSource); i++){if (j == 4){nDes[nDesLoc] = nTotalNum;  //每一个int数组为上存储四个数字nTotalNum = 0;j = 0;nDesLoc++;}thisNum = (int)(szSource[i] - '0') + 0;nTotalNum = nTotalNum*10 + thisNum;j++;}if (nTotalNum != 0){nDes[nDesLoc] = nTotalNum;   nTotalNum = 0;j = 0;nDesLoc++;}*Len = nDesLoc;cout<<"长度为"<<nDesLoc<<endl;for (int j = 0; j< nDesLoc; j++){cout<<nDes[j]<<" ";}cout<<endl;}void LenAdd(){int ALen = nLenA;int BLen = nLenB;int CStart = 0;int nFlag = 0;while (ALen != 0 && BLen != 0){nResult[CStart] = (nNumA[ALen-1] + nNumB[BLen-1] + nFlag) % 9999;nFlag = (nNumA[ALen-1] + nNumB[BLen-1] + nFlag) / 9999;CStart++;ALen--;BLen--;}while (ALen > 0){nResult[CStart] = (nNumA[ALen-1]  + nFlag) % 9999;nFlag = (nNumA[ALen-1] +  nFlag) / 9999;CStart++;ALen--;}while (BLen > 0){nResult[CStart] = (nNumB[BLen-1]  + nFlag) % 9999;nFlag = (nNumB[BLen-1] +  nFlag) / 9999;CStart++;BLen--;}nLenR = CStart;cout<<"相加结果为:"<<endl;for (int i = CStart-1; i >-1 ; i--){cout<<nResult[i]<<" ";}cout<<endl;}int main(){char szInput[100];cout<<"输入第一个操作数"<<endl;cin>>szInput;CharToInt(szInput, nNumA, &nLenA);cout<<"输入第二个操作数"<<endl;cin>>szInput;CharToInt(szInput,nNumB, &nLenB);LenAdd();system("pause");}




0 0