请设计一个算法完成两个超长正整数的加法。用字符串来解决,按位加然后考虑进位就OK。
下面是代码实现:
#ifndef _ADDLONGINTERGER_ #define _ADDLONGINTERGER_ /*================================ Macros ===================================*/ #define FALSE 0 #define TURE 1 /*============================= Include Function ===============================*/ int AddLongInteger(char *addend, char *augend,char *result); #endif//_ADDLONGINTERGER_ #include"AddLongInteger.h" #include<string.h> /***********************************************************/ /************函数名:AddCharInerger*************************/ /************入口参数:加数字符和被加数字符*****************/ /************返回值:相加结果*******************************/ /************函数功能:求两个数相加结果*********************/ /***********************************************************/ static int AddCharInerger(char addend,char augend) { int ret = (addend -‘0‘) + (augend - ‘0‘); return ret; } /***********************************************************/ /************函数名:AddLongInteger*************************/ /************入口参数:加数字符串和被加数字符串*************/ /************返回值:相加结果*******************************/ /************函数功能:求两个超长数相加*********************/ /***********************************************************/ int AddLongInteger(char *addend,char *augend,char *result) { int index = 0; int tmp = 0; int sizeAddend = strlen(addend); int sizeAugend = strlen(augend); int tempNumber = sizeAddend; //判断是否正确输入 if((NULL == addend)&&(NULL == augend)&&(NULL == result)) { return FALSE; } if(tempNumber <= sizeAugend) { tempNumber = sizeAugend; } while(tempNumber) { int temp = AddCharInerger(addend[sizeAddend-1],augend[sizeAugend-1])+tmp; //判断是否要进位 if(temp >= 10) { result[index] = temp%10 + ‘0‘; tmp = temp/10; } else { tmp = 0; result[index] = temp + ‘0‘; } index++; sizeAddend--; //判断是否越界 if(sizeAddend == 0) { sizeAddend += 1; addend[sizeAddend-1] = ‘0‘; } sizeAugend--; //判断是否越界 if(sizeAugend == 0) { sizeAugend += 1; augend[sizeAugend-1] = ‘0‘; } tempNumber--; } //最后是否有进位 if(tmp > 0) { result[index] = (tmp + ‘0‘); result[index+1] = ‘\0‘; } else { result[index] = ‘\0‘; } return TURE; } #include"AddLongInteger.h" #include<stdio.h> #include<stdlib.h> #include<string.h> /***********************************************************/ /************函数名:inputArray*****************************/ /************入口参数:加数字符串和被加数字符串和结果*********/ /************返回值:判断是否成功***************************/ /************函数功能:输入*********************************/ /**********************************************************/ int inputArrayM(char **addend,char **augend,char **result) { char ch = 0; int countAddend = 0; int countAugend = 0; printf("请输入加数:"); *addend = (char *)malloc(sizeof(char)); if(NULL == *addend) { return FALSE; } while((ch = getchar()) != ‘\n‘) { *(*addend+countAddend) = ch; countAddend++; *addend = (char *)realloc(*addend,(countAddend+1)*sizeof(char)); if(NULL == *addend) { return FALSE; } } *((*addend)+countAddend) = ‘\0‘; printf("请输入被加数:"); *augend = (char *)malloc(sizeof(char)); if(NULL == *addend) { return FALSE; } while((ch = getchar()) != ‘\n‘) { *(*augend+countAugend) = ch; countAugend++; *augend = (char *)realloc(*augend,(countAugend+1)*sizeof(char)); if(NULL == *addend) { return FALSE; } } *((*augend)+countAugend) = ‘\0‘; if(countAugend > countAddend) { *result = (char *)malloc((countAugend+3)*sizeof(char)); } else { *result = (char *)malloc((countAddend+3)*sizeof(char)); } return TURE; } /* 程序的入口main */ int main() { int index = 0; char *addend = NULL; char *augend = NULL; char *result = NULL; inputArrayM(&addend,&augend,&result); if(FALSE == AddLongInteger(addend,augend,result)) { printf("计算出错\n"); return 0; } index = strlen(result)-1; for(;index>=0;index--) { printf("%c",result[index]); } printf("\n"); system("pause"); free(addend); free(augend); free(result); return 0; }
原文:http://zhaoxiaohu.blog.51cto.com/10778115/1752316