好久没写程序了,最近比较有时间,就上POJ练练手。很惭愧,1001前后写了好几天,才AC,先贴上代码~~
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
char * multi(string a,int N,char restult[]);
int main(void)
{
string a;//= "10.19";
int b;//= 6;
char result[130];
string test;
ifstream in("input.txt");
ifstream out("output.txt");
while(cin >>a >>b)
{
multi(a,b,result);
//cout << a<< '\t' << b <<endl;
//cout << result;
for(int i=0;result[i] != '\0';i++)
cout << result[i];
/* for(int i = 0;i<test.size();i++)
if(result[i] != test[i])
{ cout << "此次测试错误"<<endl;
cout <<"正确答案"<<test;
break;
}*/
cout <<endl;
}
return 0;
}
char* multi(string a,int N,char restult[])
{
int sum[130];
char sum_temp[130];
int int_a[8];
int temp;
unsigned char i,j;
char flag_a =0; //数a是否有小数点
char flag_b =0; //数b是否有小数点
char point_a =0; //数a有几位小数点
char point_b =0; //数b有几位小数点
char point = 0;
char N_temp = 1;
char num_sum;
unsigned int N_a = a.size();
sum_temp[0] = 1;
for(i = 1;i<130;i++)
sum_temp[i] = 0;
for( i= 0;i<130;i++)
sum[i] = 0;
/*指数是0跟1的分开处理*/
if(N == 0)
{
restult[0]= '1';
restult[1]='\0';
return restult;
}
/*else if(N == 1)
{
int i;
for(i =0;i<a.size();i++)
restult[i] = a[i];
restult[i]= '\0';
return restult;
}*/
/*先把string倒序,即最低位在string的第0个位置*/
for(int i = 0;i<N_a/2;i++)
{
char temp;
temp = a[i];
a[i] = a[N_a-1-i];
a[N_a-1-i] =temp;
}
//cout <<a<<endl;
/*把字符型数字转化为int数字,存储在数组*/
for(i = 0;i<N_a;i++)
{ if(a[i] =='.')
{
point_a =i;
flag_a = 1;
}
else
{ if(flag_a)
int_a[i-1] = a[i]-'0';
else
int_a[i] = a[i]-'0';
}
}
if(flag_a)
N_a-=1;
/*处理乘数中有一个为0的情况*/
for(i = 0;(i<N_a) && (int_a[i] == 0);i++)
;
if(i == N_a)
{
restult[0] = '0';
restult[1] = '\0';
return restult;
}
/*前置0的处理*/
do{
if(int_a[N_a-1] == 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[N_a-1]);
for(int k=0;k<N;k++)
{
/*两个大数相乘*/
for(i = 0;i<N_a;i++)
for(j = 0;j<N_temp;j++)
sum[i+j] +=int_a[i]*sum_temp[j];
/*把乘完的sum数据位倒置,即最高位在数组最后,最低位在最前面*/
num_sum=N_a+N_temp;//下面这个用来计算a*b之后总的数据位
//for(i=0;i<num_sum/2;i++)
//{
// temp = sum[i];
// sum[i] =sum[num_sum-1-i];
// sum[num_sum-1-i] = temp;
//}
for(i = 0;i<num_sum;i++)
{
temp= sum[i]/10;
sum[i] = sum[i]%10;
sum[i+1] +=temp;
}
if(k <N-1)
{ for(i=0;i<num_sum;i++)
{ sum_temp[i] = sum[i];
sum[i] = 0;
}
N_temp=N_temp+N_a;
}
}
//for(i=0;i<num_sum;i++)
// cout << sum[num_sum-1-i];
//cout <<endl;
/*前置0的处理*/
do{
if(sum[num_sum-1] == 0)
{
//for(int i =0;i<num_sum-1;i++)
//sum[i] = sum[i+1];
num_sum= num_sum -1;
//point = point -1;
}
}while(!sum[num_sum-1]);
//cout<< "经过前置0的处理";
//for(i=0;i<num_sum;i++)
// cout << sum[num_sum-1-i];
//cout <<endl;
point = N*point_a;
/*如果整数部分为0,要在整数部分补个0*/
while(num_sum <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;i++)
{
if(i == num_sum-point)
{ //cout <<'.';
restult[j++] = '.';
}
//cout << sum[num_sum-1-i];
restult[j++] = sum[num_sum-1-i]+'0';
}
restult[j] = '\0';
//cout <<endl;
return restult;
}
最后有要说几点:
1.代码只是实现了,优化没去做,欢迎大神指导讨论;
2.POJ的测试很bt,题目给的测试数据过了还不行,一直是WA,最后是网上找了一个完整的测试数据,才找到问题所在,所以大家有各种莫名的WA,可以找下测试数据,自己测试哪几个数据过不了。测试数据下面链接地址有:http://www.cnblogs.com/HCOONa/archive/2010/07/10/1775005.html