poj1001Exponentiation解题报告

思路:

(1)将输入的字符串转化为整数,并记下小数点的位置;

(2)将转化所得整数再次转化为字符串,进行大数相乘;

(3)首先判断所得结果是否为零,若不为零,将小数点插入到结果字符串的合适位置,进行结果格式化;

(4)结果输出。

下面是自己摸索着写的代码,供大家参考

 

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int loc;	//记录小数点位置,作为全局变量

//将字符串转化为整数,并记录小数点位置,返回值为字符串的整数值
int StringToInt(const string str);
//大数相乘,返回值为相乘结果
string Muling(string str1,string str2);
int count(string str);

int main()
{
	//freopen("in.txt","r",stdin);
	string str;
	int n;
	while(cin>>str>>n)
	{
		/*cout<<"str="<<str<<endl;
		cout<<"n="<<n<<endl;*/
		loc=0;
		int r=StringToInt(str);
		//cout<<r<<endl;
		//将r转化为string类型
		string str1;
		stringstream ss;
		ss<<r;
		ss>>str1;
		string str2(str1);
		//cout<<"str1="<<str1<<endl;
		//cout<<"str2="<<str2<<endl;
		//多次相乘
		for(int i=0;i<n-1;i++)
		{
			str1=Muling(str1,str2);
		}

		if(str1=="0")
		{
			cout<<0<<endl;
		}
		/*str1=Muling(str1,str2);
		cout<<str1<<endl;*/
		//结果格式化
		else
		{
			loc*=n;
			if(str1.length()<loc)
			{
				cout<<".";
				for(int i=loc;i>str1.length();i--)
				{
					cout<<0;
				}
				for(int i=0;i<str1.length();++i)
				{
						cout<<str1[i];
				}
				cout<<endl;
			}
			else
			{
				loc=str1.length()-loc;
				//将小数点插入str1的合适位置
				string::iterator it=str1.begin()+loc;
				str1.insert(it,'.');
				//对小数点后全为零的处理
				for(string::iterator iter=str1.end()-1;iter!=str1.begin();iter--)
				{
					if('0'==*iter)
					{
						str1.erase(iter);
					}
					else
					{
						if('.'==*iter)
						{
							str1.erase(iter);
						}
						break;
					}
				}
				//输出结果
				for(int i=0;i<str1.length();++i)
				{
					cout<<str1[i];
				}
				cout<<endl;
			}
		}
	}
	return 0;
}

int StringToInt(string str)
{
	int num=0;
	int len=str.length();	//获取字符串的长度
	int i=1;
	for(string::iterator it=str.begin();it!=str.end();++it)
	{
		char ch=*it;
		//cout<<ch<<endl;
		if(ch=='.')
		{
			loc=len-i;
			//cout<<"loc="<<loc<<endl;
		}
		else
		{
			int temp=ch-'0';
			num*=10;
			num+=temp;
			++i;
		}
	}

	return num;
}

string Muling(string str1,string str2)
{
	string result(str1.length()+str2.length(),'0');
	for(int len2=str2.length()-1;len2>=0;len2--)
	{
		if(str2[len2])
		{
			for(int len1=str1.length()-1,len=len2+str1.length();len1>=0;len1--,len--)
			{
				int temp=(str1[len1]-'0')*(str2[len2]-'0');
				result[len-1]=char(result[len-1]+(result[len]-'0'+temp)/10);
				result[len]=char((result[len]-'0'+temp)%10+'0');
			}
		}
	}
	if(count(result)==result.length())
		return "0";
	return result.substr(result.find_first_not_of('0'));
}

int count(string str)
{
	int count=0;
	for(int i=0;i<str.length();++i)
	{
		if(str[i]=='0')
			count++;
	}
	return count;
}


注释的一些语句是自己在调试过程中查看中间结果所用

提供一些测试用例:

100.00 1

.23459 1

1.0001 3

00.100 1

00.010 1

00.001 1

001.00 1

01.000 1

000.00 1

0.0000 1

 

00.000 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值