任意两个超级大的整数以字符形式出现,如"999999999999999999999",计算它们的和,结果仍以字符串形式输出。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1024
int CalcBigNumberAdd(const char *pNumA, const char *pNumB, char *pRet)
{
int iLenA = 0;
int iLenB = 0;
int iMax = 0;
int iNumA = 0;
int iNumB = 0;
int iTmpSum = 0;
char cNeedCarry = 0;
iLenA = strlen(pNumA);
iLenB = strlen(pNumB);
iMax = (iLenA > iLenB?iLenA:iLenB);
while (iMax > 0)
{
iNumA = (iLenA > 0?(pNumA[iLenA - 1] - '0'):0);
iNumB = (iLenB > 0?(pNumB[iLenB - 1] - '0'):0);
if (cNeedCarry)
{
iTmpSum = iNumA + iNumB + 1;
}
else
{
iTmpSum = iNumA + iNumB;
}
if (iTmpSum >= 10)
{
cNeedCarry = 1;
pRet[iMax - 1] = (iTmpSum % 10) + '0';
}
else
{
cNeedCarry = 0;
pRet[iMax - 1] = iTmpSum + '0';
}
--iMax;
--iLenA;
--iLenB;
}
if(cNeedCarry)
{
for (iMax = strlen(pRet); iMax > 0; --iMax)
{
pRet[iMax + 1] = pRet[iMax];
}
pRet[0] = '1';
}
return 0;
}
int main(int argc, char *argv[])
{
char cRet[MAX_LEN + 1] = {0};
char cNumA[MAX_LEN] = {0};
char cNumB[MAX_LEN] = {0};
int iRetLen = 0;
printf("Please input number A:\n");
scanf("%s", cNumA);
printf("Please input number B:\n");
scanf("%s", cNumB);
CalcBigNumberAdd(cNumA, cNumB, cRet);
iRetLen = strlen(cRet) + 5;
printf("\n%*s\n%*c\n%*s\n%*.*s\n%*s\n",
iRetLen, cNumA,
iRetLen - 1, '+',
iRetLen, cNumB,
iRetLen, iRetLen, "------------",
iRetLen, cRet);
return 0;
}
测试结果: