当前位置: 代码迷 >> C语言 >> [求助]谁能提供一个好的算法让N的M次方计算的更快!
  详细解决方案

[求助]谁能提供一个好的算法让N的M次方计算的更快!

热度:182   发布时间:2005-04-25 07:44:00.0
[求助]谁能提供一个好的算法让N的M次方计算的更快!
谢谢各位大峡了~~~~~~~~~~~~~~~
搜索更多相关的解决方案: 算法  

----------------解决方案--------------------------------------------------------
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
long double s;
printf("Input n and m:");
scanf("%d%d",&n,&m);
s=powl(n,m);
printf("The result is %f\n",s);
return 0;
}
----------------解决方案--------------------------------------------------------
比哪个算法更快?
有源程序吗
----------------解决方案--------------------------------------------------------
#include<stdio.h>
#include<math.h>
main()
{int i,j;
long sum;
printf("please input i,j:\n");
scanf("%d %d",&i,&j);
sum=pow(i,j);
printf("%d\n",sum);
}
因为pow是double型的。你要换成int也行
sum=(int)pow(i,j); 强制转换。当你输入2  3 的时候。他就输出8
----------------解决方案--------------------------------------------------------
有谁知道POW的源函数是什么吗?
发出来看看
要不我们怎么知道有什么办法比他更快呢~?
----------------解决方案--------------------------------------------------------
pow是c语言的库函数。就如printf()一样
----------------解决方案--------------------------------------------------------
以下纯属个人观点:
应该是pow()最快,因为能编出编译器的人,应该为每个函数的效率都考虑过了,但是不排除以后会有更先进的。
  但是不知道pow的原型是什么样子的,函数库里只是说明而已,没有源代码。
----------------解决方案--------------------------------------------------------

不清楚 pow() 函数的算法,应该如 牛虻 所说的吧。 有个办法能使程序运行快原来差不多一半的,但不是最好的。方法很简单: N的M次方=(N*N)的 M/2 次方,M如果不是偶数则在求出结果后再乘一次就OK。 让循环的次数减少一半,那理论上会比原来快接近一半的速度。 如果再按同样的方法继续减少幂的次数,也可能会徒添难度和麻烦。 附上源代码: #include "stdio.h" #include "conio.h"

int cdecl main(void) { double Result=1.0; int M,M2; double N; int T=0; /*辅助循环的临时变量*/ int T2; double R; /*存储 N*N 的值的变量 */ /* 提示输入 N 和 M,这里输入的 N 和M 不检查是否输入错误了,若超出了数值最大表达范围,会产生一个运行期错误*/ printf("Input (N,M):\n"); scanf("%lf,%d",&N,&M);

M2 = M; if( N == 0 ) /*底数为0的情况*/ Result = 0; else if(M == 0) /*指数为0的情况*/ Result = 1; else { M = abs(M); R = N*N; /* R 得到 N*N 的值*/ T2 = M/2; /*T2为循环次数,它是 M 的一半*/

while(T++<T2) Result *= R;

if(M%2) Result *= N; /*是奇数的话,让它再乘一次 N*/ }

if(M2<0) /*指数为负,则结果为其倒数*/ Result = 1.0/Result;

printf("Result: [%.5lf]",Result); getch(); return 0; }

[此贴子已经被作者于2005-5-18 3:04:07编辑过]


----------------解决方案--------------------------------------------------------
楼上的我不懂!
----------------解决方案--------------------------------------------------------
如果楼主需要求精确值,那么得实现一个大数乘法。在此基础上,用下面的方法可以减少乘法次数 for(t=n, r=1; m; t*=t, m>>=1) { if (m & 1) r *= t; } 复杂度为O(log2(m))次大数乘法就可以了。
----------------解决方案--------------------------------------------------------
  相关解决方案