大数乘方可以看成多个数不断的相乘,关键就是如何连续的相乘
代码如下:
#include<stdio.h>
#include<string.h>
char c[2000];//全局变量,存储大数运算的结果
char a[2000];
int Judge(char ch[])
{//判断字符串ch是否全为0,若全为1,返回,否则返回0
int i,k;
k=strlen(ch);
for(i=0;i<k;i++)
if(ch[i]!='0')
return 0;
return 1;
}
void BigNumMulti(char a1[],char b1[])
{
int i,j,k,lena,lenb;
int a[1000]= {0},b[1000]= {0},d[2000]= {0};
//将字符串转化为整型数组,并逆置
lena=strlen(a1),lenb=strlen(b1);
for(i=0; i<lena; i++)
a[i]=a1[lena-i-1]-'0';
for(i=0; i<lenb; i++)
b[i]=b1[lenb-i-1]-'0';
//计算乘数从低位到高位以此乘以被乘数的低位到高位
for(i=0; i<lena; i++)
for(j=0; j<lenb; j++)
{
d[i+j]=d[i+j]+a[i]*b[j];
d[i+j+1]+=d[i+j]/10;
d[i+j]=d[i+j]%10;
}
//根据高位是否为判断整型数组的位数
k=lena+lenb;
while(!d[k-1])
k--;
//积转化为字符型
for(i=0; i<k; i++)
c[i]=d[k-1-i]+'0';
if(Judge(c))//若积全为0,则只输出一个0
strcpy(c,"0");
}
void BigNumInvol(char a1[],int b1)
{
int i;
char temp[1000];
strcpy(temp,a1);//注意乘方是自己乘自己,而不是结果乘结果
if(b1==1) strcpy(c,a1);
else if(b1==0) strcpy(c,"1");
else
{
for(i=2; i<b1; i++)
{
BigNumMulti(a1,temp);
strcpy(temp,c);
memset(c,0,sizeof(c));//将c清空,防止出现错误
}
//进行最后一次乘法
BigNumMulti(a1,temp);
if(Judge(c))//若结果全为0,则只输出一个0
strcpy(c,"0");
}
}
int main()
{
int n;
while(~scanf("%s%d",a,&n))
{
BigNumInvol(a,n);
printf("%s\n",c);
memset(c,0,sizeof(c)); //注意将c字符串清空
}
return 0;
}