POJ 1001 浮点数幂

本文提供了一种解决POJ 1001问题的方法,通过使用C++实现字符串与整数的大数乘法运算,并分享了解题过程中遇到的问题及解决方案。
好久没写程序了,最近比较有时间,就上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


【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值