128 带有小数的浮点数 大数乘法

来源:互联网 发布:java中英文字母排序 编辑:程序博客网 时间:2024/05/01 12:59

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);//记录小数点位置elsen1[k1++]=a[i]-'0';}k2=0;for(i=0;i<len2;i++){if(b[i]=='.')r2=len2-(i+1);elsen2[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;} 


0 0
原创粉丝点击