#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
typedef unsigned long U4;
int mul(U4* xx,U4 yy,int ws);
void main( )
//精确计算自然数n的m次幂
//限制: n 小于10亿,m=2,3,…
//环境: VC++6.0
{
U4 nn,*pp;
int mm,ws,i;
printf("底数,幂次=");
scanf("%lu,%d",&nn,&mm);
if(nn>=1e9||mm<2)abort( );
//确定结果是几位数(10进制)
ws=mm*log10((double)nn)+1;
//定结果是几位数(10亿进制)
ws=(ws+8)/9;
//申请U4型动态数组(存放结果)
pp=(U4*)malloc(ws*sizeof(U4));
if(pp==NULL)abort( );
//现在pp[]中存放的是nn的1次幂
pp[0]=nn;for(i=1;i<ws;i++)pp[i]=0L;
ws=1;//当前结果(在10亿进制下)的位数
//下面这个语句负责计算nn的mm次幂
for(i=2;i<=mm;i++)ws=mul(pp,nn,ws);
//以下按10进制显示nn的mm次幂
printf("%lu",pp[ws-1]);
for(i=ws-2;i>=0;i--)printf("%09lu",pp[i]);
printf("\n");
//释放动态数组pp
free(pp);
}
int mul(U4* xx,U4 yy,int ws)
//10亿进制多位数xx与一位
//数yy相乘,积仍放在xx中。
//形参ws为被乘数xx的位数,
//函数返回值为乘积的位数。
{ int i;
U4 cy=0,billion=1000000000;
__asm mov edi,xx
for(i=0;i<ws;i++)
{
__asm mov eax,[edi]
__asm mul Dword ptr yy
__asm add eax,cy
__asm adc edx,0
__asm div Dword ptr billion
__asm mov [edi],edx
__asm mov cy,eax
__asm add edi,04
}
if(cy)xx[i]=cy,ws++;
return ws;
}