2009年4月24日星期五

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 && N != -1) {
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;

}

2009年4月3日星期五

Test

It is only a test.