大数乘法
2016-03-25 22:39
369 查看
乘积是逐位相乘,也就是aibj,结果加入到积C的第i+j位,最后处理进位即可,例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同。B=25 = 2*10 + 5 = (5, 2);C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2) = (5, 22, 2) = (5, 2. 4)=425。
原博客的思路为:
(1)转换并反转,字符串转换为数字并将字序反转;
(2)逐位相乘,结果存放在result_num[i+j]中;
(3)处理进位,消除多余的0;
(4)转换并反转,将计算结果转换为字符串并反转。
(1)上述思路是先转换反转,其实无需先将全部字符串转换为数字的,可即用即转,节约空间;
(2)无需等到逐位相乘都结束,才处理进位,可即乘即进;
(3)无需等到所有结果出来后,将结果转换为字符,可即乘即转。
头文件和数据结构:
字符串反转:
两数相乘:
主函数:
原博客的思路为:
(1)转换并反转,字符串转换为数字并将字序反转;
(2)逐位相乘,结果存放在result_num[i+j]中;
(3)处理进位,消除多余的0;
(4)转换并反转,将计算结果转换为字符串并反转。
原博客中采用指针参数传递,字符串长度有限制,改为通过string传参数, 上面的思路还是很清晰的,但代码有些过长,考虑优化如下:
(1)上述思路是先转换反转,其实无需先将全部字符串转换为数字的,可即用即转,节约空间;
(2)无需等到逐位相乘都结束,才处理进位,可即乘即进;
(3)无需等到所有结果出来后,将结果转换为字符,可即乘即转。
优化后时间复杂度不变,但节省了空间,代码更简洁。如下:
头文件和数据结构:
#include <iostream> #include <string> #include <vector> #include <stdlib.h> #include <assert.h> using namespace std; struct bigcheng2 { string a; string b; string result_str; }; void reverse_data( string &data);//字符串反转 void multiply2(bigcheng2 &tempcheng2);//字符串模拟相乘
字符串反转:
void reverse_data( string &data) { char temp = '0'; int start=0; int end=data.size()-1; assert( data.size()&& start <= end ); while ( start < end ) { temp = data[start]; data[start++] = data[end]; data[end--] = temp; } }
两数相乘:
void multiply2(bigcheng2 &tempcheng2) { reverse_data(tempcheng2.a);//字符串反转 reverse_data(tempcheng2.b); int c=0; string temp(tempcheng2.a.size()+tempcheng2.b.size(),'0');//将temp全部初始化为0字符 for (unsigned int i=0;i<tempcheng2.a.size();i++) { unsigned int j; for (j=0;j<tempcheng2.b.size();j++) { c+=temp[i+j]-'0'+(tempcheng2.a[i]-'0')*(tempcheng2.b[j]-'0');//注意temp[i+j]可能保存有上一次计算的结果 temp[i+j]=(c%10)+'0';//将结果转换为字符 c=c/10; } while(c) { temp[i+j++]+=c%10;//temp里已存字符 c=c/10; } } for (int i=temp.size()-1;i>=0;i--) { if (temp[i]!='0') 8f58 break; else temp.pop_back(); } reverse_data(temp);//结果?字Á?符¤?串ä?反¤¡ä转Áa tempcheng2.result_str=temp; }
主函数:
int main() { bigcheng2 tempcheng2; string a,b; cin>>a>>b; tempcheng2.a=a; tempcheng2.b=b; multiply2(tempcheng2); cout<<tempcheng2.result_str<<endl; system("pause"); return 0; }
相关文章推荐
- 全栈工程师
- leetcode_074 Search a 2D Matrix
- 发布后注意
- Android Studio SDK 代理地址设置
- oracle编译存储过程提示表或视图不存在的问题分析
- [LeetCode] Combinations
- prepareStatement和Statement的区别
- AppAgent 内存泄漏问题总结与反思
- 从MVC到MVVM
- 最短路径的Dijkstra算法(邻接表)
- iOS xml文件的解析方式 XMLDictionary,GDataXMLNode,NSXMLParser 转发自徒步天涯
- 二维数组的动态内存分配
- 五、初学SpringMVC+Mybatis之SpringMVC简介
- Java异常分类和统一处理
- hdu2159
- 贴近自身的装修
- Trick(十五)—— 树结构如何判断一个节点是内部节点(internal node)还是叶子节点(leaf node)
- 关于OGR读取多边形-Polygon(GDAL 2.0版本之前)
- 【数据结构排序算法系列】数据结构八大排序算法
- 【数据结构排序算法系列】数据结构八大排序算法