北大OJ_1001题:求正数的高精度幂

程序说明

程序效率不高,时间复杂度为O(n^2),有待进一步的优化,呵呵 

 

程序代码

#include <iostream>
#include <string>
#include <vector>

using namespace std;




//求两个大数的乘积(两数均为正数)
string GetProductOfTwoBigNum( string strNumLeft, string strNumRight )
{
	
	//使用小学所学方法,计算两个大数乘积
	///

	if ( strNumRight.empty() && strNumRight.empty() )
	{
		return string("0");
	}

	//转换为数字
	for( string::size_type i = 0; i < strNumLeft.size(); ++i )
	{
		strNumLeft[i] -= '0';
	}
	for( string::size_type i = 0; i < strNumRight.size(); ++i )
	{
		strNumRight[i] -= '0';
	}


	string::size_type nMaxBits = strNumLeft.size() + strNumRight.size() + 1;//最大位数,多增加一位,便于编码
	string strProduct( nMaxBits, NULL );//保存每步乘积累加之和
	char szTemp = NULL;//每位乘积,辅助变量
	char szCarrayTemp = NULL;//进位信息

	for( int i = strNumRight.size() - 1; i >= 0; --i )
	{
		string strProductStep( nMaxBits, NULL );//保存每步之和
		int k = strNumRight.size() - i - 1;
		for( int j = strNumLeft.size() - 1; j >= 0; --j )
		{
			szTemp = ( strNumRight[i] * strNumLeft[j] + strProductStep[k] ) % 10;
			szCarrayTemp = ( strNumRight[i] * strNumLeft[j] + strProductStep[k] ) / 10;

			strProductStep[k] = szTemp;
			strProductStep[++k] += szCarrayTemp;	
		}

		//将这一步结果累加strProduct中
		for( string::size_type m = 0; m < nMaxBits - 1; ++m )
		{
			szTemp = ( strProductStep[m] + strProduct[m] ) % 10;
			szCarrayTemp = ( strProductStep[m] + strProduct[m] ) / 10;

			strProduct[m] = szTemp;
			strProduct[m+1] += szCarrayTemp;
		}
	}

	//返回遍历strProduct,从而取出计算的结果
	string strResult;
	int k = nMaxBits - 1;
	while( k >= 0 && strProduct[k] == NULL )
	{
		--k;
	}
	for( ; k >= 0; --k )
	{
		strResult.push_back( strProduct[k] + '0');//转换为字符
	}

	if ( strResult.empty() )
	{
		strResult.push_back( '0' );
	}

	return strResult;
}


string GetExponentiationOfBigNum( string strBigNum, unsigned int nPower )
{
	if ( strBigNum.empty() )
	{
		return string("0");
	}

	if ( nPower == 0 )
	{
		return string("1");
	}

	//
	//计算小数位有效位数
	int nSignificantCount = 0;
	//查找小数点
	string::size_type nDotPos = strBigNum.find( '.' );
	if ( nDotPos != string::npos )
	{
		//有小数点,计算小数有效位
		string::size_type nCurPos = strBigNum.size() -1;
		while( nCurPos > nDotPos )
		{
			if ( strBigNum[nCurPos] != '0' )
			{
				break;
			}
			--nCurPos;
		}
		nSignificantCount = nCurPos - nDotPos;

 		//去除小数点后的非有效数字,即0
		strBigNum = strBigNum.substr( 0, nCurPos+1 );
	}
	nSignificantCount *= nPower;


	//去除小数点前的非有效数字,即0
	nDotPos = strBigNum.find( '.' );
	if ( nDotPos != string::npos )
	{
		string::size_type nCurPos = 0;
		while( nCurPos < nDotPos )
		{
			if ( strBigNum[nCurPos] != '0' )
			{
				break;
			}
			++nCurPos;
		}
		strBigNum = strBigNum.erase( 0, nCurPos);
	}
	
	//去除小数点
	nDotPos = strBigNum.find( '.' );
	if ( nDotPos != string::npos )
	{
		strBigNum.erase( nDotPos, 1 );
	}

	
	//迭代计算大数的幂
	string strResult("1");
	while ( nPower > 0 )
	{
		strResult = GetProductOfTwoBigNum( strResult, strBigNum );
		--nPower;
	}

	//插入小数点
	if( strResult.size() < nSignificantCount )
	{
		//在前面补0
		strResult.insert( 0, nSignificantCount - strResult.size(), '0' );
	}
	if ( nSignificantCount > 0 )
	{
		strResult.insert( strResult.size()-nSignificantCount, 1, '.' );
	}
	


	return strResult;
}


int main()
{
// 	string strNum;
// 	unsigned int nPower;
// 	cout << "输入正数及幂:";
// 	while( cin >> strNum >> nPower )
// 	{
// 		string strResult = GetExponentiationOfBigNum( strNum, nPower );
// 		cout << strNum << "^" << nPower << " = " << strResult << endl;
// 		cout << "--------------------------------------------------" << endl;
// 		cout << "输入正数及幂:";
// 	}

	string strNum;
	unsigned int nPower;
	while ( cin >> strNum >> nPower )
	{
		cout << GetExponentiationOfBigNum( strNum, nPower ) << endl;
	}

	return 0;
}




运行如下:




作者:山丘儿
转载请标明出处,谢谢。原文地址:http://blog.csdn.net/s634772208/article/details/46508757

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值