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

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;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值