整数大数加法
2012-05-19 10:36
232 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> char * BigNumberAdd(const char *a, const char *b); int main(void) { const char * a = "9879797978979798797"; const char * b = "97979797987979797979797979797987"; char * result = BigNumberAdd(a,b); if ( result!= NULL ) { printf("\n%s + %s = %s\n", a, b, result); } else { printf("result is NULL\n"); } system("pause"); exit(EXIT_SUCCESS); } char * BigNumberAdd(const char *a, const char *b) { int i = 0; int j = 0; char memberOfA[2]; char memberOfB[2]; int lengthOfA = strlen(a); int lengthOfB = strlen(b); int a_index = lengthOfA - 1; //数字A的最大索引号。因为加法是从最右边开始加起的嘛 int b_index = lengthOfB - 1; //数字B的最大索引号。因为加法是从最右边开始加起的嘛 int maxLength = (lengthOfA>lengthOfB ? lengthOfA : lengthOfB) + 1; //结果的最大位数,+1是为了防止进位时长度不足 //printf("maxLength is %d\n", maxLength); int * result = (int *)malloc( sizeof(int) * (maxLength) ); char * char_result = (char *)malloc( sizeof(char) * (maxLength) ); memset(result, 0, sizeof(int) * (maxLength) ); //将result置0 memset(char_result, 0, sizeof(char) * (maxLength) ); //将char_result置0 if ( result!=NULL && char_result!=NULL ) { fprintf(stdout, "分配内存成功,在文件%s中第%d行!!\n", __FILE__, __LINE__); } else { fprintf(stdout, "分配内存失败,在文件%s中第%d行!!\n", __FILE__, __LINE__); return NULL; } //开始计算,最大的循环次数为结果的结果的最大长度 for (i=maxLength-1; i>=0; i--) { //将数字A最右边的数字取出来保存在 memberOfA中,不足位数的用0来补 if ( a_index >= 0 ) { sprintf(memberOfA, "%c", a[a_index--]); } else { sprintf(memberOfA, "0"); } //将数字B最右边的数字取出来保存在 memberOfA中,不足位数的用0来补 if ( b_index >= 0 ) { sprintf(memberOfB, "%c", b[b_index--]); } else { sprintf(memberOfB, "0"); } //将结果保存在result的最右边,类似于下面的计算,从最右边开始计算: // 2 3 // + 4 8 // = 6 11 result[i] = atoi(memberOfA) + atoi(memberOfB); //printf("memberOfA is %d, memberOfB is %d \n", atoi(memberOfA), atoi(memberOfB)); //printf("memberOfA is %s, memberOfB is %s \n", memberOfA, memberOfB); } //进位,从结果的最右边开始进位 for (i=maxLength-1; i>=0; i--) { if ( result[i] >= 10 ) { result[i-1] += result[i] / 10; result[i] = result[i] % 10; } } /* for (i=0; i<maxLength; i++) { printf("result[%d] is %d \n", i, result[i]); } */ i = 0; while( result[i] == 0 ) { i++; } for (j=0; i<maxLength; i++, j++) { char_result[j] = result[i]+'0'; } free(result); result = NULL; return char_result; }
相关文章推荐
- 大一下期末考试 : 大数存储 超长整数的加法
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- 大数加法(整数的加法)
- 剑指offer之面试题12 大数相加 实现任意两个整数的加法
- 大数加法,整数,正数
- 双向循环链表长整数加法(大数加减法)
- Java程序练习-长整数加法运算
- hdu 1753(大数——加法)
- HDU1047 - Integer Inquiry (大数加法)
- 51Nod 1005 大数加法
- LeetCode 两个整数的加法运算,不使用+符号
- C++大数(正整数)相加相减v1
- html实现大整数加法
- 大整数加法
- 2981 大整数加法
- 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)
- 大数加法和大数减法
- 大整数加法函数
- 51Nod--1005 大数加法
- hdu 1002大数加法