这几天做了一道 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;
}