POJ 1001 浮点数幂

好久没写程序了,最近比较有时间,就上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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值