前言
用此例题来记录下高精度乘法
一、分析
既然涉及到高精度必然是用数组来解决了
二、代码
1.
代码如下(示例):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 45
char s1[maxn],s2[maxn];
int ss[2*maxn];
void mul(char* a,char* b,int* c)
{
int i,j,len1,len2,*s;
len1=strlen(a);
len2=strlen(b);
s=(int*)malloc(sizeof(int)*(len1+len2));
for(i=0;i<len1+len2;i++)
s[i]=0;
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
}
}
for(i=len1+len2-1;i>=0;i--)
{
if(s[i]>=10)
{
s[i-1]+=s[i]/10;//高位加低位的进位
s[i]%=10;
}
}
i=0;
while(s[i]==0) i++;//去前导0
for(j=0;i<len1+len2;i++,j++)
c[j]=s[i];
for(i=0;i<j;i++)//在这里wa了好几次,原来是要输出int型数据,一直在转成字符型输出了。结果一直错,我是傻逼。
printf("%d",c[i]);
printf("\n");
free(s);
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
mul(s1,s2,ss);
return 0;
}
2.(下面还摘抄了别人的更加容易理解的代码)
代码如下(示例):
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int MAXN = 1005;
int num1[MAXN],num2[MAXN],ans[MAXN];
string str1,str2;
void multiply(){
memset(ans,0,sizeof(ans));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int len1 = str1.size();
int len2 = str2.size();
//反转存储,便于运算
for(int i=len1-1,k=0; i>=0; i--) num1[k++]=str1[i]-'0';
for(int i=len2-1,k=0; i>=0; i--) num2[k++]=str2[i]-'0';
for(int i=0; i<len1; i++){//大数相乘
for(int j=0; j<len2; j++){
ans[i+j]+=num1[i]*num2[j];
ans[i+j+1]+=ans[i+j]/10;
ans[i+j]%=10;
}
}
int len = 1000;
while(len--){//去前导0
if(ans[len]!=0) break;
}
for(int i=len; i>=0; i--) cout<<ans[i];//输出
cout<<endl;
}
int main()
{
while(cin>>str1>>str2) multiply();
return 0;
}