n^n的第一位数

来源:互联网 发布:班超定西域知乎 编辑:程序博客网 时间:2024/05/17 07:24

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;}


原创粉丝点击