大浮点数相乘

这几天做了一道 POJ上面的题目,题目是浮点数的幂。这道题目实现的前提是把大浮点数相乘先给实现,下面是实现的代码,原来以为挺容易的,因为之前做过大int数相乘,觉得应该改改很快的,后来发现调试起来还是有挺多问题。主要1.小数点位数的处理;2前置0即0.004及后置0如乘完结果尾数含有0 ,如0.12×5=0.60的处理代码如下,自己测试觉得没什么问题的,各路高手如果测试有什么问题,欢迎留言,讨论,谢谢!

#include <string>
#include <iostream>

using namespace std;
char *  multi(string a,string b,char restult[]);
int main(void)
{
	string  a;//= "12.00";
	string  b;//= "123";
	char   result[200];
	cin >>a >>b;
	multi(a,b,result);
	//cout << result;
	for(int i=0;result[i] != '\0';i++)
		cout << result[i];

	return 0;
}


char*  multi(string a,string b,char  restult[])
{
	int  sum[200];
	int    int_a[100],int_b[100];
	int    temp,i,j;
	int   flag_a  =0;     //数a是否有小数点
	int   flag_b  =0;     //数b是否有小数点
	int   point_a =0;    //数a有几位小数点
	int   point_b =0;    //数b有几位小数点
	int   point    = 0;

	int   N_a = a.size();
	int   N_b = b.size();

	for( i= 0;i<40;i++)
		sum[i] = 0;

	/*处理乘数中有一个为0的情况*/
	for(i = 0;(i<N_a) && (a[i] == '0');i++)
		;
	if(i == N_a)
	{	 restult[0] = '0';
		 restult[1] = '\0';
		 return  restult;
	}
	for(i = 0;(i<N_b) && (b[i] == '0');i++)
		;
	if(i == N_b)
	{	 restult[0] = '0';
		 restult[1] = '\0';
		return restult;
	}

	/*把字符型数字转化为int数字,存储在数组*/
	for(i = 0;i<N_a;i++)
	{  if(a[i] =='.')
	{	
		point_a = N_a -1- i;		
		flag_a = 1;	
	}
	else	          
	{  if(flag_a)
	int_a[i-1] = a[i]-'0';
	else
		int_a[i] = a[i]-'0';
	}
	} 
	for(i = 0;i<N_b;i++)
	{  
		if(b[i] =='.')
		{	
			point_b = N_b-1 - i;  
			flag_b = 1;
		}
		else	          
			if(flag_b)
				int_b[i-1] = b[i]-'0';
			else
				int_b[i] = b[i]-'0';
	}

	if(flag_a)
		N_a-=1;
	if(flag_b)
		N_b-=1;

	/*前置0的处理*/
	do{
		if(int_a[0] == 0)
		{
			for(int i =0;i<N_a-1;i++)
				int_a[i] = int_a[i+1];
			N_a= N_a -1;
			//point = point -1;
		}
	}while(!int_a[0]);

	do{
		if(int_b[0] == 0)
		{
			for(int i =0;i<N_b-1;i++)
				int_b[i] = int_b[i+1];
			N_b= N_b -1;
			//point = point -1;
		}
	}while(!int_b[0]);

	/*两个大数相乘*/
	for(i = 0;i<N_a;i++)
		for(j = 0;j<N_b;j++)
			sum[i+j] +=int_a[i]*int_b[j];

	/*把乘完的sum数据位倒置,即最高位在数组最后,最低位在最前面*/	
	int  num_sum=N_a+N_b;//下面这个用来计算a*b之后总的数据位
	for(i=0;i<(num_sum-1)/2;i++)
	{
		temp = sum[i];
		sum[i] =sum[num_sum-2-i];
		sum[num_sum-2-i] = temp;
	}

	for(i = 0;i<num_sum-1;i++)
	{
		temp= sum[i]/10;
		sum[i] = sum[i]%10;
		sum[i+1] +=temp;
	}

	point = point_a+point_b;
	/*如果整数部分为0,要在整数部分补个0*/
	while(num_sum-1 <=point)
	{
		num_sum = num_sum +1;
		sum[num_sum-1] = 0;
	}
	/*有小数点的后置0处理*/

	while(point)
	{
		if(sum[0] == 0)
		{	for(i = 0;i<num_sum-1;i++)
		sum[i] = sum[i+1];
		point =point-1;
		num_sum = num_sum-1;
		}
		else
			break;
	}

	j=0;
	for(i = 0;i<num_sum-1;i++)
	{  
		if(i == num_sum -1-point)
		{	//cout <<'.';
		restult[j++] = '.';	
		}
		//cout << sum[num_sum-2-i];
		restult[j++] = sum[num_sum-2-i]+'0';
	}
	restult[j] = '\0';
	//cout <<endl;
	return restult;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值