高精度乘法
麻烦的模拟题,核心在于大数乘小数中(A*b),将大数A中的每一位与小数b相乘,用进位p表示所需进位,然后逐一更新大数A中的每一位
值得注意的是,大数A需要倒序存储,因为当需要进位的时候,一直向上填数组位置即可;若不倒序存储,进位时就会在a[-1]位置进位,这样会造成段错误
#include<iostream> using namespace std; int a[100000]; int n,cnt=0; void f(int n) { if(n==0) cout<<0<<endl; else { int p=0;//记录进位 for(int j=0;j<=cnt;j++)//更新每一位 { p=a[j]*n+p; a[j]=p%10; p=p/10; } while(p!=0) { cnt++; a[cnt]=p%10; p=p/10; } for(int i=cnt;i>=0;i--) cout<<a[i]; } } int main() { string s; cin>>s; for(int i=s.size()-1;i>=0;i--) a[cnt++]=s[i]-'0'; cnt--;//cnt保证没有前导0 cin>>n; f(n); return 0; }
该代码使用了数组来存储高精度整数,并实现了高精度的乘法运算。在主函数中,输入两个字符串表示的高精度整数,然后调用mul函数进行乘法计算并输出结果。
需要注意的是,该代码中的高精度乘法并没有考虑负数的情况,如果需要支持负数的乘法运算,需要在代码中增加相关的处理逻辑。
C++模拟,利用vector容器直接模拟运算即可
#include<iostream> #include<vector> using namespace std; vector<int> mul(vector<int>& A,int b) { vector<int> C; int t=0; for(int i=0;i<A.size();i++) { t+=A[i]*b; C.push_back(t%10); t/=10; } while(t) { C.push_back(t%10); t/=10; } while(C.size()>1&&C.back()==0) C.pop_back();//去除前导0 return C; } int main() { string a; int b; cin>>a>>b; vector<int> A; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); vector<int> C=mul(A,b); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; return 0; }
高精度乘法应用
阶乘计算
#include<iostream> using namespace std; void f(int n) { if (n == 1) cout << "1"; else { int a[100000], tail = 0, head = 0, p = 0; a[0] = 1; for (int i = 2; i <= n; i++) { for (int j = head; j <= tail; j++) { p = a[j] * i + p; a[j] = p % 10; p = p / 10; } while (p != 0) { tail++; a[tail] = p % 10; p = p / 10; } } for (int i = tail; i >= 0; i--) cout << a[i]; } } int main() { int n; cin >> n; f(n); return 0; }
该代码将阶乘计算分解成了一个个乘法运算。在主函数中,输入一个整数n,然后调用fac函数计算n的阶乘。在fac函数中。
tail用于去除前导0