http://www.cnblogs.com/dmesg/archive/2009/08/02/1536997.html
我想知道怎么求N的N次方,这个数据是很大的,但是我要的是这个数据的最高位的数,应该有什么好的方法吧!
请大侠们帮帮忙吧!!(N <1000000000)
这个问题提出后,fallening同学便很快的在五分钟内作出了解答
log_10(N^N)=N*log_10(N) 因此,log_10(N)的第一位就是你要求的:)
我在三楼看的很疑惑,于是向同学提出问题,一天之后他给出解答
N^N=10^(Nlog(N))=10^(log(N))*10^N= 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)
而到这里,大家很明显就能看出这位同学的推理错误10^(N log(N))= 10^(log(N))*10^N。。。哈哈
哈哈,如果你和我一样开始笑话起这个同学,那么我们就太可悲了。。。
看看楼下的朋友们是怎么做的吧,,
hityct1:我的想法:
根据11楼的想法,改动一下。
N^N = 10^(N*log(N))中,
由于 N <1000000000,
N*log(N)取值在[0,9000000000],没有超出double数据的范围,没有益处。
设N*log(N)的整数部分为intpart,分数部分为fractpart,
则N^N = 10^(intpart + fractpart) = 10^intpart * 10^fractpart.
其中10^intpart肯定为10的倍数,不影响结果,可忽略。
所以:
10^fractpart的最高位即为结果。
不用大数,double即可满足。
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY;
以下程序是我自己写的:modf函数是用来分开整数部分和小数部分的;虽然都是用的double类型
double integer,xiaoshubufen;用法:xiaoshubufen=modf(x,&integer);
这样就把x的整数部分和小数部分分开了;
#include<stdio.h>
#include<math.h>
int main()
{
double m,n,j,k;
int i;
while(scanf("%lf",&k)!=EOF)
{
m=modf(k*1.0*log10(k*1.0),&j);
m=modf(pow((double)10,m),&j);
printf("%d\n",(int)j);
}
return 0;
}