#include <stdio.h>
int main(void)
{ int m,n,t,j,j1,a,b,i;
static int p[7000];
scanf("%d,%d",&m,&n);
j=0;j1=1;p[1]=1;b=0;
for (i=1;i<=n;i++)
{ while (b!=0||j<=j1)
{ j++;
a=p[j]*m+b;
b=a/10;//b是进位标志,
p[j]=a-10*b;
}
j1=j;j=0;
}
printf("%d^%d=",m,n);
for (i=j1;i>=1;i--)
printf("%d",p[i]);
putchar('\n');
}
希望哪位高人能非常 详细 的注释下这段代码,说下具体的算法也行,
还有就是怎么解决出现在结果前面的“0”
这个是一个高精度算法求M^N的一个过程,其中
for (i=1;i<=n;i++)
{ while (b!=0||j<=j1)
{ j++;
a=p[j]*m+b;
b=a/10;//b是进位标志,
p[j]=a-10*b;
}
j1=j;j=0;
}
这一段是一个高精度乘法的过程,p数组是用数组表示的一个数,用来存储当前结果的,p初始为1,每次循环把p*m的值存进p,这里由于用高精度算法,p是用数组存储这个数的每一位,从个位依次p[1],p[2]...j1存放当前数(p)的位数,初始p为1,所以j1为1
while (b!=0||j<=j1)
{ j++;
a=p[j]*m+b;
b=a/10;//b是进位标志,
p[j]=a-10*b;
}
这一层循环是计算p*m的,j表示位数,每次j是从1开始(j初始化成0,但是第一步会+1,所以是1),然后
a=p[j]*m+b;b代表前一位的进位,第一次时没有前一位,所以b=0,计算完之后,a得到的是p的个位*m的值,b=a/10,表示需要进位的值,最后p[i]=a-b*10,就是最终计算的个位数。依次循环每次计算第j位的值,最后更新当前最高位j1,j = 0,进入下一个循环,直到计算完M^N为止,每次*m,循环n次就可以了。
还有就是,这个程序应该不会出现前导0的情况,因为每次j1是存储当前的最高位,最终是从j1开始输出,第一位一定是有效位,不会出现前导0。
这个是一个高精度乘法吧,也不能说是求pow(m,n)吧,因为真正的POW函数,m和n 都可以是double型的,也就是说,可以算根号3之类的,不过pow函数效率很低。
这个程序仅能执行整数的n次幂