求任意数的任意次方(C++)

Source Code

Problem: 1001

Memory: 244K
Time: 47MS

Language: C++
Result: Accepted

  • Source Code
    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    string multiWithChar(string a,char b);
    string multiWithString(string a,string b);
    string addWithString(string a,string b);
    int getPointNum(string a,int r);
    string deletePoint(string);
    string deleteInsignificant(string);
    string Exponentiation(string,int);
    string recoverPoint(string,int);
    string solve(string,int);
    
    int main()
    {
    	string s;
    	int n;
    
    	while(cin>>s>>n)
    	{
    		cout<<solve(s,n)<<endl;
    		
    	}
    	return 0;
    }
    string solve(string a, int r)
    {
    
    	int pointnum=getPointNum(a,r);
    	return deleteInsignificant(recoverPoint(Exponentiation(deletePoint(a),r),pointnum));
    }
    string multiWithChar(string a,char b_)
    {
    	int len=a.length();
    	int up=0;
    	int b=b_-'0';
    	string ret="";
    	for (int i=len-1;i>=0;i--)
    	{
    		int w=(a.at(i)-'0')*b;	
    		ret.append(1,(up+w)%10+'0');
    		up=(w+up)/10;	
    	}
    	if(up!=0)
    	ret.append(1,up+'0');
    	std::reverse(ret.begin(),ret.end());
    	return ret;
    }
    string multiWithString(string a,string b)
    {
    	
    	string ret="";
    	int appnum=0;
    	for (int i=b.length()-1;i>=0;i--)
    	{
    		string temp=multiWithChar(a,b.at(i));
    		temp.append(appnum++,'0');
    		ret=addWithString(ret,temp);
    
    	}
    	return ret;
    }
    string addWithString(string a,string b)
    {
    
    	if(a=="")return b;
    	if(b=="")return a;
    	string temp;
    	if(a.length()<b.length()){
    		temp=a;
    		a=b;
    		b=temp;
    	}
    	int maxlen=a.length();
    	int minlen=b.length();
    	int up=0;
    	string ret="";
    	for (int i=maxlen-1,j=minlen-1;i>=0;i--,j--)
    	{
    	
    		int w=((j<0)?0:(b.at(j)-'0'))+(a.at(i)-'0');
    		ret.append(1,(up+w)%10+'0');
    		up=(w+up)/10;
    	}
    	
    	if(up!=0)
    	ret.append(1,up+'0');
    	std::reverse(ret.begin(),ret.end());
    	return ret;
    }
    int getPointNum(string a,int r)
    {
    	int pos=a.find('.');
    	if(pos==-1)return 0;
    	return (a.length()-1-pos)*r;
    
    }
    string deletePoint(string s)
    {
    	int pos=s.find('.');
    	if(-1==pos)return s;
    	return s.substr(0,pos).append(s.substr(pos+1));
    }
    string deleteInsignificant(string s)
    {
    	if(s.find('.')==-1)return s;
    	int i=s.length();
    
    	while (s.at(i-1)=='0')
    	{
    		i--;
    
    	}
    	if(s.at(i-1)=='.')i--;
    	if(s.at(0)=='0')s=s.substr(1,i);
    	return s.substr(0,i);
    }
    string Exponentiation(string r,int n)
    {
    	string ret="";
    	if(n==1)return r;
    	if(n==2)
    	{
    		return multiWithString(r,r);
    	}
    	else if(n%2==0)
    	{
    		return Exponentiation(Exponentiation(r,2),n/2);
    	}
    	else 
    	{
    		return multiWithString(r,Exponentiation(r,n-1));
    	}
    
    	
    }
    string recoverPoint(string s,int pointnums)
    {
    	if(!pointnums)return s;
    	s=s.insert(s.length()-pointnums,".");
    	return s;
    }

转载于:https://www.cnblogs.com/yangyh/archive/2009/11/23/1608418.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值