c++实现大数乘法
2015-12-22 00:51
295 查看
思路
第i位数乘第j位数,乘积是第i+j位数(从0开始)
如123*456
乘积各位数为
个位 3*6
十位 2*6 + 3*5
百位 2*5 + 1*6 + 3*4
千位 1*5 + 2*4
万位 1*4
然后从后往前,取余更新。
代码
Case 1:
4038
5255
21219690
Case 2:
123456
234567
28958703552
第i位数乘第j位数,乘积是第i+j位数(从0开始)
如123*456
乘积各位数为
个位 3*6
十位 2*6 + 3*5
百位 2*5 + 1*6 + 3*4
千位 1*5 + 2*4
万位 1*4
然后从后往前,取余更新。
代码
#include <stdio.h> #include <iostream> #include <vector> #include <math.h> #include <algorithm> #include <queue> #include <string.h> #include <set> #include <stack> #include <stdlib.h> #include <time.h> using namespace std; struct Node { int d[2009]; int len; Node() {memset(d, 0, sizeof(d));} Node(char *s) { memset(d, 0, sizeof(d)); int i = 0; while(s[i] != '\0') { d[i] = s[i] - '0'; ++i; } len = i; for(int i=0,j=len-1; i<j; i++,j--) swap(d[i],d[j]); } Node operator * (const Node &t) const { Node ans; for(int i=0;i<this->len;i++) { for(int j=0;j<t.len;j++) { ans.d[i+j] += this->d[i] * t.d[j]; } } for(int i=0;i<this->len+t.len;i++) { ans.d[i+1] += ans.d[i] / 10; ans.d[i] %= 10; } int len = this->len+t.len; while(len > 1 && ans.d[len-1] == 0) len--; ans.len = len; return ans; } }; char str[1009]; int main() { scanf("%s",str); Node a(str); scanf("%s",str); Node b(str); Node ans = a * b; for(int i=ans.len-1; i>=0; i--) printf("%d",ans.d[i]); printf("\n"); return 0; }
Case 1:
4038
5255
21219690
Case 2:
123456
234567
28958703552
相关文章推荐
- 我的c语言总结
- c语言总结
- C/C++语言复习(一)
- c++异常处理机制示例及讲解
- 位反转的最佳算法(C语言实现)
- 洪恩软件之编程之道C/C++程序设计入门视频教程
- C语言:快速排序
- 【C++ STL应用与实现】23: 如何使用std::mem_fn (since C++11)
- c语言之基础-1
- c++实现大数加法(含负数)
- CEdit::GetLine 在Win7上返回字符串乱码问题的解决方案 CEdit::GetLine (MFC, VC++6) returns extra characters in Windows
- C++Builder组件
- C++中的单例模式
- 《C语言及程序设计》第十一讲实践项目
- 一起talk C栗子吧(第七十九回:C语言实例--父进程与子进程)
- C++单例模式实现及可能的问题
- C语言总结
- C++查找一个目录下特定扩展名文件的一个小技巧
- 我的c语言学习总结
- C语言总结