整数大数减法
2012-05-19 16:51
417 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> char * BigNumberSubtration(const char *a, const char *b); int main(void) { int isSwap = 0; char *a = "9988798794654987657946579849874654132156798794654984613246"; char *b = "5826143213410346162471303216654677941012324646321446546879"; char *tmp_a = (char *)malloc( sizeof(char) * strlen(a) + 1); char *tmp_b = (char *)malloc( sizeof(char) * strlen(b) + 1); if ( tmp_a==NULL || tmp_b==NULL ) { //printf("分配内存tmp_a, tmp_b失败在文件:%s中第%d行\n", __FILE__, __LINE__); exit(1); } else { strcpy(tmp_a, a); strcpy(tmp_b, b); //printf("分配tmp_a, tmp_b内存成功在文件:%s中第%d行\n", __FILE__, __LINE__); } char * tmp = NULL; /* 确保a>b,用大数减小数,然后根据原来的数的大小来确定正负号 如果a<b则交换两个数 */ if ( strlen(a) < strlen(b) || strcmp(a, b)<0) { tmp = (char *)malloc( sizeof(char) * (strlen(a)+1) ); if ( tmp== NULL ) { //printf("分配内存tmp失败在文件:%s中第%d行\n", __FILE__, __LINE__); exit(1); } else { // printf("分配内存tmp成功在文件:%s中第%d行\n", __FILE__, __LINE__); } strcpy(tmp, a); // printf("tmp is %s\n", tmp); a = (char *)malloc( sizeof(char) * (strlen(b)+1) ); memset(a, 0, sizeof(char) * strlen(a)+1); strcpy(a, b); // printf("a is %s\n", a); b = (char *)malloc( sizeof(char) * (strlen(tmp)+1) ); memset(b, 0, sizeof(char) * strlen(b)+1); strcpy(b, tmp); //printf("b is %s\n", b); isSwap = 1; } //printf("a is %s, b is %s\n", a, b); char * result = BigNumberSubtration(a, b); if ( result!=NULL) { if ( isSwap ) { printf(" %-s\n -%-s \n =-%s \n", tmp_a, tmp_b, result); } else { printf(" %-s\n -%-s \n =%s \n", tmp_a, tmp_b, result); } } else { printf("result is NULL!\n"); } printf("\n"); free(tmp); free(tmp_a); free(tmp_b); free(result); tmp = NULL; tmp_a = NULL; tmp_b = NULL; result = NULL; system("pause"); return 0; } char * BigNumberSubtration(const char *a, const char *b) { int i = 0; int j = 0; int lengthOfA = strlen(a); int lengthOfB = strlen(b); int a_index = lengthOfA - 1; int b_index = lengthOfB - 1; char memberOfA[2]; char memberOfB[2]; int maxLength = ( lengthOfA>lengthOfB ? lengthOfA: lengthOfB ) + 1; int * result = (int *)malloc( sizeof(int) * maxLength ); char * char_result = (char *)malloc( sizeof(char) * maxLength ); if ( result==NULL || char_result==NULL ) { printf("分配内存空间失败!在文件%s中第%d行!!\n", __FILE__, __LINE__); return NULL; } else { //printf("分配内存空间成功!在文件%s中第%d行!!\n", __FILE__, __LINE__); } memset(result, 0, sizeof(int) * maxLength ); memset(char_result, 0, sizeof(char) * maxLength ); for (i=maxLength-1; i>=0; i--) { if ( a_index >= 0 ) { sprintf(memberOfA, "%c", a[a_index--]); } else { sprintf(memberOfA, "0"); } if ( b_index >= 0 ) { sprintf(memberOfB, "%c", b[b_index--]); } else { sprintf(memberOfB, "0"); } result[i] = atoi(memberOfA) - atoi(memberOfB); } /* for (i=0; i<maxLength; i++) { printf("%d ", result[i]); } printf("\n"); */ for(i=maxLength-1; i>1; i--) { if ( result[i] < 0 ) { result[i-1] = result[i-1] - 1; result[i] = result[i] + 10; } } /* for (i=0; i<maxLength; i++) { printf("%d ", result[i]); } */ i = 0; while ( result[i]==0 ) { i++; } for (j=0; i<maxLength; i++, j++) { char_result[j] = result[i] + '0'; } char_result[j] = '\0'; printf("\n"); free(result); result = NULL; return char_result; }
相关文章推荐
- 百练_2736大整数减法(大数相减)
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- 大数减法
- 高精度--大数减法 luogu 2142
- Java大数模板——加法、减法、乘法、除法、开方、求余
- 11:大整数减法
- 算法(求对输入的N个数进行加法或减法运算,得到最小的正整数的组合.)
- JS实现两个大数(整数)相乘 实例代码
- 大整数减法计算思路与算法实现
- 大数相加,高精度阶乘,大整数进制转换,大整数判断被小整数整除(JOJ--1029)
- 实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:输入t
- 使用C++类实现大数加法,大数减法,大数乘法
- 例7.2 输入两个整数,要求输出其中值较大者。要求用函数来找到大数。
- POJ 2756 Autumn is a Genius 采用string大数减法
- 大数整数相加(忽略负数)
- 大数运算-减法(C/C++实现)
- Java大数乘法的简单实现(整数和浮点数的乘法)
- 大数减法模板
- 大一下期末考试 : 大数存储 超长整数的加法
- zzuli 1627大整数减法