幂运算

Posted 2006hanziwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了幂运算相关的知识,希望对你有一定的参考价值。

题目描述

小明的老师布置了一道幂运算题:一般情况下,计算机所能够处理的小数的范围和精度都是非常有限的。老师给出了一个小数a和指数b,让小明求abab。小明觉得手算非常麻烦,希望你能帮助他。

输入输出格式

输入格式:

共两行:

第一行是a,第二行是b。0<a<1000,a的长度不超过10位,保证这个数字有一个小数点,但不保证这个数字有整数部分或小数部分。比如可以用“.”代表0,但是这个数据不会出现。例如000.10会写成.10。1≤b≤25,为整数。

输出格式:

只有一行,即abab的结果。整数部分前面有0必须去掉,小数部分末尾有0也必须去掉。例如000.10100需要变为.101(整数部分为0也去掉)。输出部分必须有一个小数点。

输入输出样例

输入样例:
1.0100
12
输出样例: 1.126825030131969720661201
思路:去掉小数点,求出结果,再加回小数点。
代码:
//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>

using namespace std;
string times(string a1,string b1)
{
	int a[30001],b[30001],c[100001],la,lb,lc,z;
	 string ans="";
	 for(int i=1;i<=20000;i++)a[i]=b[i]=c[i]=0;
	 la=a1.size();lb=b1.size();
	 for(int i=0;i<=la-1;i++)a[la-i]=a1[i]-48;
	 for(int i=0;i<=lb-1;i++)b[lb-i]=b1[i]-48;
	 for(int i=1;i<=la;i++)
	 {
			z=0;
			for(int j=1;j<=lb;j++)
			{
				c[i+j-1]=a[i]*b[j]+z+c[i+j-1];
				z=c[i+j-1]/10;
				c[i+j-1]%=10;
			}
		   c[i+lb]=z;
	 }
	 lc=la+lb;
	 while(c[lc]==0&&lc>1)lc--;
	 for(int i=lc;i>=1;i--)ans+=c[i]+48;
	 return ans;
}                   
string s,r,ans="1";
int x,n,l,w,y,z;
int main()
{
    cin>>s;
	cin>>n;
	y=s.size()-1;
	while(ans[y]==‘0‘)y--;
	for(int i=0;;i++)if(s[i]==‘.‘){x=i;break;}else r+=s[i];
	for(int i=x+1;i<s.size();i++)r+=s[i];
	for(int i=1;i<=n;i++)ans=times(ans,r);
	z=r.size()-x;l=ans.size()-1;y=l;
	while(ans[l]==‘0‘)l--;
	for(int i=0;i<=y+1-z*n-1;i++)cout<<ans[i];
	cout<<".";
	if(x==0){for(int i=1;i<=n-1;i++)cout<<0;for(int i=0;i<=l;i++)cout<<ans[i];}
	else for(int i=y+1-z*n;i<=l;i++)cout<<ans[i];
	                                                                                                                               
	

    return 0;
}

以上是关于幂运算的主要内容,如果未能解决你的问题,请参考以下文章

为 Scala 创建“**”幂运算符?

Luogu 题解 P1226 [模板] 快速幂||取余运算

a^b(位运算&快速幂)

快速幂基本模板

codevs 2541 幂运算(迭代加深搜索)

2018暑假集训 DAY5 T4 幂运算