您的位置:首页 > 其它

POJ 1001 求高精度幂

2016-07-28 15:51 375 查看
高精度问题  初学的时候觉得很恶心。

去掉小数点,原数组存在另一个数组,将小数点标记。

用中间数组进行存储,模仿笔算乘法

去掉前导0 后导0 用up down 

<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
#define MAX 26*5
char str[6];
int res[MAX],a[MAX],b[MAX];
int n,dot;
int lena,lenb;

void mul()
{
memset(res,0,sizeof(res));
for(int i=1; i<=lena; i++)
for(int j=1; j<=lenb; j++)
{
res[i+j-1] +=a[i]*b[j];
if(res[i+j-1]>9)
{
res[i+j] += res[i+j-1]/10;
res[i+j-1] %=10;
}
}

lena=lena+lenb;
for(int i=1; i<=lena; i++)
a[i]=res[i];
}

int main()
{
//freopen("in.txt","r",stdin);
int down,up;
while(scanf("%s %d",str,&n)!=EOF)
{
dot=-1;
for(int i=5,j=1; i>=0; i--)
{
if(str[i]!='.')
{
a[j]=b[j]=str[i]-'0';
j++;
}
else
dot=i;
}
if(dot==-1) lena=lenb=6;
else lena=lenb=5;
for(int i=1; i<n; i++) mul();
if(dot==-1)
{
for(int i=lena; i>0; i--)
printf("%d",a[i]);
printf("\n");
}
else
{
dot =5-dot;
dot *=n;
for(int i=1; i<=lena; i++)
if(a[i]!=0)
{
down=i;
break;
}
for(int j=lena; j>0; j--)
{
if(a[j]!=0)
{
up=j;
break;
}
}
int i=up;
if(up<dot)
i=dot;
int j=down;
if(down>dot)
j=dot+1;
for(; i>=j; i--)
{
if(i==dot)
printf(".");
printf("%d",a[i]);
}
}
printf("\n");
}
return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: