大数乘法 - 大数作为字符串的C语言操作
2016-04-26 14:51
1471 查看
【问题描述】
编写程序实现两个超长整数(大于等于0,每个最长80位数字)的乘法运算。
【输入形式】
从键盘分行读入两个超长整数,要考虑输入高位可能为0的情况(如00083),每行的最后都有回车换行。
【输出形式】
输出只有一行,是两个长整数的乘法运算结果,从高到低依次输出各位数字,各位数字紧密输出。除非结果为0,否则最高位不能为0。
【输入样例】
134098703578230056
002340980000000000
【输出样例】
313922383102564996494880000000000
【样例说明】
进行两个整数乘法运算,134098703578230056 * 002340980000000000 = 313922383102564996494880000000000。
编写程序实现两个超长整数(大于等于0,每个最长80位数字)的乘法运算。
【输入形式】
从键盘分行读入两个超长整数,要考虑输入高位可能为0的情况(如00083),每行的最后都有回车换行。
【输出形式】
输出只有一行,是两个长整数的乘法运算结果,从高到低依次输出各位数字,各位数字紧密输出。除非结果为0,否则最高位不能为0。
【输入样例】
134098703578230056
002340980000000000
【输出样例】
313922383102564996494880000000000
【样例说明】
进行两个整数乘法运算,134098703578230056 * 002340980000000000 = 313922383102564996494880000000000。
#include <stdio.h> #include <string.h> void reverse(char str[]) { int l=0,r=strlen(str)-1; char tmp; while (l < r) { tmp = str[l]; str[l] = str[r]; str[r] = tmp; l++, r--; } } void add(char A[],char B[], char rst[]) { reverse(A); reverse(B); int i = 0; int tmp, carryover = 0; while (A[i] != '\0'&&B[i] != '\0') { tmp = A[i] - '0' + B[i] - '0'; if (tmp > 9) { tmp = tmp - 10; rst[i] = tmp + '0'; if (carryover) rst[i]++; carryover = 1; } else { rst[i] = tmp + '0'; if (carryover) rst[i]++; carryover = 0; } i++; } if (B[i] == '\0' && A[i] != '\0') { rst[i] = A[i]; if (carryover) rst[i]++; i++; while (A[i] != '\0') { rst[i] = A[i]; i++; } } else if (A[i] == '\0'&&B[i] != '\0') { rst[i] = B[i]; if (carryover) rst[i]++; i++; while (B[i] != '\0') { rst[i] = B[i]; i++; } } else if (A[i] == '\0'&&B[i] == '\0'&&carryover) { rst[i] = 1; i++; } while (rst[i-1] == '0'&&i>1) i--; rst[i] = '\0'; reverse(A); reverse(B); if(A!=rst) reverse(rst); } void multiply(char A[], char B[], char rst[]) { int i,j,k,carryover; char intermed[161]; rst[0] = '0';rst[1]='\0'; int tmp; reverse(A); reverse(B); i = 0; carryover = 0; while (B[i] != '\0') { for (j = 0; j < strlen(A); j++) { tmp = (A[j] - '0')*(B[i] - '0'); intermed[j] = '0' + tmp % 10; intermed[j] += carryover; carryover = 0; if (intermed[j] > '9') { intermed[j] -= 10; carryover++; } while (tmp > 9) { tmp -= 10; carryover++; } } if (carryover) intermed[j++] = '0' + carryover; carryover = 0; intermed[j] = '\0'; reverse(intermed); for (k = 0; k < i; k++) intermed[j+k] = '0'; intermed[j+k] = '\0'; add(rst, intermed, rst); i++; } reverse(A); reverse(B); } int main() { char A[81],B[81]; char rst[161]; scanf("%s",A); scanf("%s",B); multiply(A, B, rst); printf("%s",rst); return 0; }
相关文章推荐
- c++第四次上级实验——分数求和
- C++使用Sqlite3,使用CppSQLite3的封装
- c语言中const关键字详解
- c++ 趣味小程序
- C 语言中指针、字符串与数组的一些关系
- c语言 #define 中的UL
- extern "C" c++如何实现函数的重载
- C++多态性
- C++封装继承多态总结
- C++多维数组
- 1054. 求平均值 (20)
- C/C++中的sizeof
- C++数组
- js to c++!鼠标点击事件!
- C++纯虚函数
- C/C++复习:高于均分的学生(结构体)
- C/C++复习:向量的数量积
- C/C++复习:点坐标(结构体)
- C++非模态对话框自动销毁的好方法
- C/C++复习:成绩统计(结构体)