大数乘法算法
2018-01-28 18:27
218 查看
将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果。
参考https://www.cnblogs.com/king-ding/p/bigIntegerMul.html
#include<iostream> using namespace std; #define MAXN 100 string multiply(char line1[], char line2[]) { short number1[MAXN], number2[MAXN], result[MAXN];//number1,number2:两个乘数;result:乘积的结果 short len1 = strlen(line1); short len2 = strlen(line2); short len = len1 + len2; bool line1isNegativeNumber = false;// 是否是负数 bool line2isNegativeNumber = false;// 是否是负数 for (int i = 0; i < len1; i++) { char number = line1[i]; if (i == 0) { if (number == '-' && len1 > 1) { line1isNegativeNumber = true; } else if (number == '-' && len1 == 1){ string invalidString("Invalid input"); return invalidString; } else if (number > '9' || number < '0'){ string invalidString("Invalid input"); return invalidString; } } else { if (number > '9' || number < '0'){ string invalidString("Invalid input"); return invalidString; } } if (number != '-') { number1[len1 - i - 1] = number - '0'; } } for (int i = 0; i < len2; i++) { char number = line2[i]; if (i == 0) { if (number == '-' && len2 > 1) { line2isNegativeNumber = true; } else if (number == '-' && len2 == 1){ string invalidString("Invalid input"); return invalidString; } else if (number > '9' || number < '0'){ string invalidString("Invalid input"); return invalidString; } } else { if (number > '9' || number < '0'){ string invalidString("Invalid input"); return invalidString; } } if (number != '-') { number2[len2 - i - 1] = number - '0'; } } if (line1isNegativeNumber) { len1--; } if (line2isNegativeNumber) { len2--; } memset(result, 0, sizeof(short) * (MAXN - 1)); for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { result[i + j] = result[i + j] + number1[i] * number2[j];//逐位相乘 } } int carry = 0; for (int i = 0; i <= len; i++){//进位 int k = result[i] + carry; result[i] = k % 10; carry = k / 10; } int realLen = 0;//实际的计算结果长度 for(int i = len - 1; i >= 0; i--) { if (result[i] != 0) {//处理多余的零 realLen = i + 1; break; } } if (line1isNegativeNumber ^ line2isNegativeNumber) { realLen++ ; } char *line = new char[realLen + 1]; if (realLen == 0) { line[0] = 0 + '0'; line[1] = '\0';//字符串的结束标志 } else { int i = 0; if (line1isNegativeNumber ^ line2isNegativeNumber) { line[0] = '-'; i = 1; } for (; i < realLen; i++) { line[i] = result[realLen - i - 1] + '0'; } line[realLen] = '\n'; } return line; } int main(int argc, const char * argv[]) { @autoreleasepool { char line1[MAXN], line2[MAXN]; while(cin >> line1 >>line2) { cout << multiply(line1, line2) << endl; } } return 0; }
参考https://www.cnblogs.com/king-ding/p/bigIntegerMul.html
相关文章推荐
- 大数乘法问题及其高效算法
- 【算法】大数乘法问题及其高效算法
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- 大数运算之加法和乘法算法C++模板
- 蓝桥杯——算法提高 大数加法&大数乘法&冒泡排序
- 大数乘法的几种算法分析及比较
- 每周算法练习——大数的乘法问题
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- 基础算法,大数加法和乘法的实现
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- [算法题] 大数乘法运算
- 大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
- 算法重拾之路——大数乘法
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题
- 2016蓝桥杯算法提高——P1001(大数乘法)
- P1001 蓝桥杯算法提高-用字符串处理大数乘法
- 蓝桥杯算法提高 ADV-197 大数乘法 题解
- 2016年算法之大数乘法
- 算法解析之大数乘法