28、两个数相乘,小数点后位数没有限制,请写一个高精度算法
大数乘法,注意小数点的控制。
这里小数点的个数,是根据两个乘数决定的,没有去除末尾的0
/*
28、两个数相乘,小数点后位数没有限制,请写一个高精度算法
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
char a[100],b[100];
int n1[100],n2[100],ans[200];
int main()
{
int t,i,j,len1,len2,r1,r2,k,k1,k2,tmp,index;
printf("请输入2个整数,输入(-1)结束:\n");
while(1)
{
scanf("%s",a);
if(strcmp(a,"-1")==0)
break;
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n2));
memset(ans,0,sizeof(ans));
k1=0;
r1=r2=0;
for(i=0;i<len1;i++)
{
if(a[i]=='.')
r1=len1-(i+1);//记录小数点位置
else
n1[k1++]=a[i]-'0';
}
k2=0;
for(i=0;i<len2;i++)
{
if(b[i]=='.')
r2=len2-(i+1);
else
n2[k2++]=b[i]-'0';
}
k=0;
for(i=k1-1;i>=0;i--)
{
index=k++;
t=0;
for(j=k2-1;j>=0;j--)
{
tmp=ans[index]+n1[i]*n2[j]+t;
ans[index++]=tmp%10;
t=tmp/10;
}
ans[index]=t;
}
i=index;
while(ans[i]==0&&i>r1+r2)i--;//去除前面0
printf("%s * %s = ",a,b); //i>r1+r2 0.保证小数点前至少有整数
for(;i>=0;i--)
{
printf("%d",ans[i]);
if(i==(r1+r2)&&r1+r2)//小数点位数0 不输出
printf(".");
}
printf("\n");
}
return 0;
}