N的N次方

pmars 2009-04-22 07:28:14
我想知道怎么求N的N次方,这个数据是很大的,但是我要的是这个数据的最高位的数,应该有什么好的方法吧!
请大侠们帮帮忙吧!!(N<1000000000)
...全文
2143 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-09-20
  • 打赏
  • 举报
回复
怀疑截断误差会导致计算出现误差,从而使得结果不对
[Quote=引用 31 楼 forglory 的回复:]
设n^n为x, 设x为10^y次方级的数(用科学计数法表示的后缀),要求的首位为f

那么
            lg(x/10^y) = lg(f)        lg是底为10的对数
上式可以变为  lg(x) - y = lg(f)  ==>  n*lg(n) - y = lg(f)

现在,只用求y即可,
其实, (int) y = lg(x) = lg(n^n) = n*lg(n), 看起来不是跟上一个相等吗?但是注意y展开后是100000...的形式,所以我们在求出了它的对数之后,只取它的整数部分即可,即y是int型,所以……后面的不用推了,把f外面的对数符号拿过去就是了。
[/Quote]
longoal 2009-09-20
  • 打赏
  • 举报
回复
mark
ForGlory 2009-09-20
  • 打赏
  • 举报
回复
设n^n为x, 设x为10^y次方级的数(用科学计数法表示的后缀),要求的首位为f

那么
lg(x/10^y) = lg(f) lg是底为10的对数
上式可以变为 lg(x) - y = lg(f) ==> n*lg(n) - y = lg(f)

现在,只用求y即可,
其实, (int) y = lg(x) = lg(n^n) = n*lg(n), 看起来不是跟上一个相等吗?但是注意y展开后是100000...的形式,所以我们在求出了它的对数之后,只取它的整数部分即可,即y是int型,所以……后面的不用推了,把f外面的对数符号拿过去就是了。
fallening 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 plaindew 的回复:]
引用 11 楼 fallening 的回复:
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)


好像不是这样的吧。
10^(log(N))*10^N 是 10^(log(N))+ N) 而不是 10^(N*log(N))
[/Quote]
发现自己摆了一个大大的乌龙,满脸羞愧地路过。
adventurelw 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 plaindew 的回复:]
引用 11 楼 fallening 的回复:
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)


好像不是这样的吧。
10^(log(N))*10^N 是 10^(log(N))+ N) 而不是 10^(N*log(N))
[/Quote]

赞成,有些不对。
对楼主的题目,要我就用string循环N-1次算,然后取第一个字符。。。。。。好笨拙啊。
hityct1 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 plaindew 的回复:]
引用 11 楼 fallening 的回复:
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)


好像不是这样的吧。
10^(log(N))*10^N 是 10^(log(N))+ N) 而不是 10^(N*log(N))
[/Quote]
的确。
adventurelw 2009-04-24
  • 打赏
  • 举报
回复
与22楼探讨
N^N = 10^(N * log(N) / log(10))吧。
wangyadong 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 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即可满足。

C/C+…
[/Quote]
八错!
plaindew 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 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即可满…
[/Quote]

re
shuaiwang_01 2009-04-24
  • 打赏
  • 举报
回复
Function Programming!
Sou2012 2009-04-24
  • 打赏
  • 举报
回复
MARK!!
TianChong 2009-04-24
  • 打赏
  • 举报
回复
10^LOG(N)
hityct1 2009-04-24
  • 打赏
  • 举报
回复
我的想法:
根据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即可满足。


#include <iostream>
#include <limits>
#include <cmath>
using namespace std;

int GetHighest(const double& n)
{
//求n^n的最高位
//注意:n取 1,2,3,...,1000000000

double intpart;
double fractpart = modf ( n * log10(n), &intpart);

//显然分数部分在[0,1)之间,所以temp在[1,10)之间,那么整数部分即为结果
double temp = pow( (double)10, fractpart);

modf ( temp, &intpart);

return intpart;
}

void main()
{
//cout<<numeric_limits<double>::max()<<endl;

cout<<GetHighest(1)<<endl;
cout<<GetHighest(2)<<endl;
cout<<GetHighest(3)<<endl;
cout<<GetHighest(4)<<endl;
cout<<GetHighest(5)<<endl;
cout<<GetHighest(6)<<endl;
cout<<GetHighest(4678)<<endl;
cout<<GetHighest(1000)<<endl;
cout<<GetHighest(1000000000)<<endl;
cout<<GetHighest(1999)<<endl;
cout<<GetHighest(999999999)<<endl;
}
seacat_hello 2009-04-24
  • 打赏
  • 举报
回复
log_10(N)显然是错的,当N是100 的时候 log_10(N) 是2,而100的100次方的首位数字显然是1。
http://huj-nju.blogspot.com/

N的N次方的首位数字
在CSDN上看到一个题目,求N的N次方的首位数字。
N^N=10^(N*logN),即可以转化求10^(N*logN)的首位数字。
对于10^(X),X为一个实数,可以分解成一个整数加一个小数的和,X = Z + P。即10^(X) = 10^(Z + P) = 10^Z * 10^P,其中(0 <= P < 1)
显然这里的10^Z是不会影响到10^(X)的首位数字,即关键问题是要求10^P的首位数字。OK,这样问题就明朗了很多。
因为0 <= P < 1 所以 1 <= 10^(P) < 10, 这里答案很简单了,只要我们求出10^(P)的值,然后取整 所得到的值就是10^(X)的首位数字
将X换成N*logN,就可以求出N^N的首位数字了。

附C++代码:

#include
#include
using namespace std;

//计算一个double型数的非整数部分
double mantissa(double dval) {
if ((int) dval != (int) (dval + 1e-8)) {
return 0;
} else {
return dval - (int) dval;
}
}

//计算首位整数
int leadDigital(double mantissaValue) {
if (mantissaValue >= 0 && mantissaValue + 1e-8 < 1) {
double temp = pow((double) 10, mantissaValue);
return (int) (temp + 1e-8);
} else {
cout << "the mantissaValue is not bigger than 0 or not less than 1" << endl;
exit(0);
return 0;
}
}

int main() {
int N;
cout << "please input the test N value:" << endl;
cout << "or input the exit value: -1" << endl;

while (cin >> N) {
if (N <= 0) {
cout << "the value of N must be bigger than zero" << endl;
}
double nlogNValue = N * log10((double) N);
double mantissaValue = mantissa(nlogNValue);
int leadValue = leadDigital(mantissaValue);
cout << "The lead digital of " << N << "^" << N << " is: " << leadValue << endl;
cout << "please input the test N value again" << endl;
}
return 0;
}
hityct1 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fallening 的回复:]
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)
[/Quote]
高!!!
plaindew 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fallening 的回复:]
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)
[/Quote]

好像不是这样的吧。
10^(log(N))*10^N 是 10^(log(N))+ N) 而不是 10^(N*log(N))
icansaymyabc 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fallening 的回复:]
N^N=10^(N log(N)) = 10^(log(N))*10^N = 10^(log(N))*1000...0(N个0)
你要最高位置的数字,只需要计算10^(log(N))的最高位即可:)
[/Quote]
数学高人!俺们玩电脑都把人脑玩废了,不懂数学了。
tianya0609 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 donle1000 的回复:]
C/C++ code
#include <iostream>

using namespace std;

int main()
{
int a[20000] = {0};
int n, array = 1, flag = 0;
a[0] = 1;
cout << "input n: ";
cin >> n;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < array; j++)
{
a[j] *= n;
a[j] += flag;
flag = a[j] / 10;
a[j] %= 10;
i…
[/Quote]

//能不能加上注释和算法说下,能懂程序,但是程序没法把它吃透,赐教下。
fairchild811 2009-04-23
  • 打赏
  • 举报
回复
用大数。或者用char数组
fellatioyzx 2009-04-23
  • 打赏
  • 举报
回复
纯学习
加载更多回复(13)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧