大数乘法以及大数的存储问题

xiaoxiao2021-02-28  100

有的问题很简单,但是他的内部却是涉及了大数的表示以及模拟大数乘法的问题。毕竟无处不坑,一不小心就会陷入大坑之中。

今天先总结两道,一道是拼多多提前批笔试的大数乘法问题,一道是剑指offer第十二题,不过我用的不是书上的方法,那狗书,写得太好了,所以不扎扎实实的看还看不懂:

一、键盘输入两个数字,输出他们的乘积。

在这里,我就先不进行判断了,比如非法的输入之类的先跳过,直接上核心代码:

#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; //大数乘法 void Change(string &st1,string &st2,vector<int> &ve1,vector<int> &ve2) { int len1 = st1.length(); int len2 = st2.length(); for(int i = 0; i < len1; ++i) { ve1.push_back(st1[i] - '0'); } for(int i = 0; i < len2; ++i) { ve2.push_back(st2[i] - '0'); } reverse(ve1.begin(),ve1.end());//逆置很重要,因为0位置最终需要代表低位数 reverse(ve2.begin(),ve2.end()); } void Mul(string &st1,string &st2) { vector<int> ve1,ve2,veend; Change(st1,st2,ve1,ve2); int len1 = ve1.size(); int len2 = ve2.size(); veend.resize(len1+len2); for(int i = 0; i < len1; ++i) { for(int j = 0; j < len2; ++j) { int k = i + j; veend[k] += ve1[i]*ve2[j]; while(veend[k] > 9) { veend[k+1] += veend[k]/10; veend[k] %= 10; k++; } } } for(int i = len1+len2-1; i >= 0; --i) { if(veend[i]) { while(i >= 0) { cout<<veend[i--]; } cout<<endl; } } } void main() { string st1,st2; while( cin >> st1 >> st2) { Mul(st1,st2); } }

二、输入一个数,打印从1到N位的最大数,例如,输入3,打印1-999

//打印从1-N位的最大数 void Print(vector<int> &ve) { int len = ve.size(); for(int i = len-1; i >= 0; --i) { if(ve[i]) { for(int j = i; j >= 0; --j) { cout<<ve[j]; } break; } } cout<<" "; } void Print(int n) { if(n <= 0) return ; vector<int> ve; ve.resize(n+1); for(int i = 0; i < n+1; ++i) ve[i] = 0; while(ve[n] == 0) { Print(ve); ve[0]++; if(ve[0] == 10) { for(int i = 0; i < n && ve[i] >= 10; ++i) { ve[i+1]++; ve[i] = 0; } } } } void main() { int n; cin>>n; Print(n); }

转载请注明原文地址: https://www.6miu.com/read-84698.html

最新回复(0)