编写思路:
由于超出long long 范围的两个数在计算机上无法实现,因此想到使用数组来模拟人脑来进行高精度乘法。
将两个字符串型的数相乘,得到的结果仍然用字符串数组来存放。这样做的好处就是可以把函数接口反复调用来实现多次高精度乘法计算。
话不多说下面直接上码上注释!
c++写法:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
#define lnt long long
#define N (lnt)100000005
//下面高精乘
string mutiply(string a,string b){
//逆置a,b(便于思维运算,代码编写)
reverse(a.begin(),a.end()); reverse(b.begin(),b.end());
//结果保存在ans里面,ans初始化
string ans;
ans.resize((a.size()+b.size())); fill(ans.begin(),ans.end(),0);
//下面核心代码
for(int i=0;i<a.size();++i)
for(int j=0;j<b.size();++j){
ans[i+j]+=(a[i]-'0')*(b[j]-'0');
//判断是否需要进位
if(ans[i+j]>=10){
ans[i+j+1]+=ans[i+j]/10;
ans[i+j]=ans[i+j]%10;
}
}
//将每一位从ASCLL 转换成 char型
for(int i=0;i<ans.size();++i) ans[i]+='0';
//将结果逆置(便于输出和使用)
reverse(ans.begin(),ans.end());
//判断首位是否为 0
if(ans[0]=='0') ans.erase(0,1);
return ans;
}
int main(){
string a,b; cin>>a>>b;
if(a[0]=='0'||b[0]=='0') cout<<"0"<<endl;
else cout<<mutiply(a,b)<<endl;
return 0;
}
c语言写法:
#include <stdio.h>
#include <string.h>
#define MAX_N 1000 // 高精度整数最大长度
int a[MAX_N], b[MAX_N], c[MAX_N*2]; // 数组a存储被乘数,b存储乘数,c存储结果
int main()
{
char sa[MAX_N], sb[MAX_N]; // 输入的被乘数和乘数字符串
scanf("%s %s", sa, sb);
int la = strlen(sa), lb = strlen(sb); // 被乘数和乘数的长度
// 将被乘数和乘数转换成整数数组形式
for (int i = 0; i < la; i++) a[la-i-1] = sa[i] - '0';
for (int i = 0; i < lb; i++) b[lb-i-1] = sb[i] - '0';
// 高精度乘法核心算法
for (int i = 0; i < la; i++)
for (int j = 0; j < lb; j++)
c[i+j] += a[i]*b[j];
int len = la+lb-1; // 结果的长度
for (int i = 0; i < len; i++) {
c[i+1] += c[i] / 10; // 进位处理
c[i] %= 10; // 取模
}
while (len > 1 && c[len-1] == 0) len--; // 去掉前导零
// 输出结果
for (int i = len-1; i >= 0; i--)
printf("%d", c[i]);
printf("\n");
return 0;
}
初级小白(在校生)整理以用作学习,若有错误,还望指正,共勉!
初次书写,若存在侵权或其他问题,定立即改正,还望海涵。