您的位置:首页 > 其它

sgu112 高精度大整数乘方

2014-07-16 20:36 204 查看
#include<iostream>
#include<cstring>
using namespace std;
int jian(int a[],int b[],int c[],int len)
{
int i;
for(i=0;i<len;i++)
{
c[i]+=a[i]-b[i];
if(c[i]<0)
{
c[i]+=10;
c[i+1]--;
}
}
while(c[len-1]==0)
len--;
if(len==0)
return 1;
else
return len;
}
int mult(int a[],int b[],int c[],int len1,int len2)
{
int d[1000],e[1000],len,i,j;               //妈蛋,害我调了半天
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
for(i=0;i<len2;i++)
d[i]=b[i];
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
e[i+j]+=a[i]*d[j];
len=len1+len2;
for(i=0;i<len;i++)
c[i]=e[i];
for(i=0;i<len-1;i++)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
if(c[len-1]>0)
len++;
return len-1;
}
bool cmp(int a[],int b[],int len1,int len2)
{
int i;
if(len1>len2)
return true;
if(len1<len2)
return false;
if(len1==len2)
{
for(i=0;i<len1;i++)
{
if(a[i]>b[i])
return true;
if(a[i]<b[i])
return false;
}
if(i==len1)
return true;
}
}
int main()
{
int a,b,a0,b0,i,a1[10],b1[10];
int a2[1000],b2[1000],c[1000];
int len,len1,len2,len3,len4;
cin>>a>>b;
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
memset(a2,0,sizeof(a2));
memset(b2,0,sizeof(b2));
memset(c,0,sizeof(c));
i=0;
a0=a;b0=b;
while(a0>0)
{
a1[i]=a0%10;
a0/=10;
i++;
}
len1=i;
i=0;
while(b0>0)
{
b1[i]=b0%10;
b0/=10;
i++;
}
len2=i;
if(a==0)
len1=1;
if(b==0)
len2=1;
a2[0]=1; b2[0]=1;
len3=1;  len4=1;
for(i=0;i<b;i++)
len3=mult(a1,a2,a2,len1,len3);
for(i=0;i<a;i++)
len4=mult(b1,b2,b2,len2,len4);
if(cmp(a2,b2,len3,len4))
{
len=jian(a2,b2,c,len3);
for(i=len-1;i>=0;i--)
cout<<c[i];
cout<<endl;
}
else
{
len=jian(b2,a2,c,len4);
cout<<"-";
for(i=len-1;i>=0;i--)
cout<<c[i];
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: