前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【POJ 1001】Exponentiation (高精度乘法+快速幂)

【POJ 1001】Exponentiation (高精度乘法+快速幂)

作者头像
饶文津
发布2020-06-02 14:20:40
5710
发布2020-06-02 14:20:40
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

BUPT2017 wintertraining(15) #6A

题意

题解

将R用字符串读进来,找到小数点的位置,然后转为整数。 用高精度乘法和快速幂计算。输出时要确定一下小数点的位置。

代码

代码语言:javascript
复制
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int base=10;
struct Num{
	int a[1000],len;
	Num(){memset(a,0,sizeof a);}
	void input(int b){
		int i;
		if(b==0)len=1;
		for(i=0;b;i++){
			a[i]=b%base;
			b/=base;
		}
		len=i;
	}
	void output()const {
		for(int i=len-1;i>=0;i--){
			printf("%d",a[i]);
		}
		puts("");
	}
	Num operator *(const Num &b)const{
		Num c;
		for(int i=0;i<len;i++)
		for(int j=0;j<b.len;j++){
			c.a[i+j]+=a[i]*b.a[j];
		}
		c.len=len+b.len-1;
		for(int i=0;i<c.len;i++){
			if(c.a[i]>=base){
				c.a[i+1]+=c.a[i]/base;
				c.a[i]%=base;
			}
		}
		if(c.a[c.len])c.len++;
		return c;
	}
};
char s[1000],ans[1000];
int d;
Num qpow(Num n,int d){
	Num ans;ans.input(1);
	while(d){
		if(d&1)ans=ans*n;
		n=n*n;
		d>>=1;
	}
	return ans;
}
int main() {
	while(cin>>s>>d){
		int i,j,b=0;
		for(i=0;s[i];i++){
			if(s[i]=='.'){j=i;}
			else b=b*10+s[i]-'0';
		}
		int l=(i-j-1)*d;
		Num c;c.input(b);
		c=qpow(c,d);
		for(i=c.len-1;i>=l;i--){
			printf("%d",c.a[i]);
		}
		for(j=0;c.a[j]==0;j++);
		
		if(i>j)printf(".");
		for(i=l-1;i>=j;i--)printf("%d",c.a[i]);
		puts("");
	}	
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 题解
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档