永发信息网

计算 pow(m,n) 的精确值

答案:1  悬赏:0  手机版
解决时间 2021-08-14 17:14

#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次幂

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
这个配置的笔记本好不好?
平时爱戴眼镜,却不爱戴帽子也不爱打伞,结果
路边有一个陌生人被捅了,你会去救吗?如果是
猇亭区宜昌猇亭汽车客运站售票厅在哪里啊,我
如何下载北师大版六年级下册整个课件?
我想问问农场里的大便收集起来有什么用的?
端午节短信问候,端午节想给爸妈发个短信祝福
被狗抓到会不会有事
电脑自动重启解决的办法
怎么删除上网痕迹,怎样彻底清除电脑上网记录
南充阳光水世界2010年8月3日可以游泳了吗?
100天生活小目标
不适应异地生活,怎么办?
东鹏卫浴是几线品牌,蓝藤卫浴的介绍
链接touch,itunes不显示设备
推荐资讯
谁有比较全一点的电影和动漫的下载网站,给我
我想买五千左右的笔记本,能玩玩劲舞还有QQ游
坐骨神经痛可以用刺络拔罐疗法吗
铁水是否能导致不孕
转运地址怎么填,日本亚马逊如何填写转运公司
BACKUP 在那个文件可以找到?
绝世紫武四块三级合金为什么我只有三块
将一张厚度为0.08毫米的白纸对折20次后
六年级暑假生活
延安市的哪个眼镜店配隐形眼镜最好?
麻城市黄冈园林社区卫生服务站怎么去啊,谁知
谁能帮我免费点亮拍拍(橙色)图标?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?