大数乘方可以看成多个数不断的相乘,关键就是如何连续的相乘

代码如下:

#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;
}