| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2279 人关注过本帖
标题:[求助]谁能提供一个好的算法让N的M次方计算的更快!
只看楼主 加入收藏
skyful
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2005-4-24
收藏
 问题点数:0 回复次数:9 
[求助]谁能提供一个好的算法让N的M次方计算的更快!
谢谢各位大峡了~~~~~~~~~~~~~~~
搜索更多相关主题的帖子: 算法 
2005-04-25 07:44
流浪者
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2005-4-24
收藏
得分:0 
#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;
}

我因我之为我而不同凡响~~~
2005-04-26 19:58
kings169524
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-5-5
收藏
得分:0 
比哪个算法更快?
有源程序吗
2005-05-06 13:33
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分: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

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-06 14:53
wanwan520
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-4-17
收藏
得分:0 
有谁知道POW的源函数是什么吗?
发出来看看
要不我们怎么知道有什么办法比他更快呢~?
2005-05-07 22:23
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
pow是c语言的库函数。就如printf()一样

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-05-08 07:22
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
以下纯属个人观点:
 应该是pow()最快,因为能编出编译器的人,应该为每个函数的效率都考虑过了,但是不排除以后会有更先进的。
  但是不知道pow的原型是什么样子的,函数库里只是说明而已,没有源代码。

土冒
2005-05-08 10:26
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 

不清楚 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编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2005-05-09 01:45
光棍一条
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-5-20
收藏
得分:0 
楼上的我不懂!
2005-05-23 19:23
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
如果楼主需要求精确值,那么得实现一个大数乘法。在此基础上,用下面的方法可以减少乘法次数 for(t=n, r=1; m; t*=t, m>>=1) { if (m & 1) r *= t; } 复杂度为O(log2(m))次大数乘法就可以了。

Have you visit acm.tongji. lately?
2005-05-23 22:44
快速回复:[求助]谁能提供一个好的算法让N的M次方计算的更快!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018037 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved