zoj 2277 The Gate to Freedom

继续数论。

 

昨晚纠结的那道题,到睡了才想起来,今天在课堂上闲着没事,就用手机搜了道数论题看。。。

 

这个题是求N^N的结果的最高位。N小于10亿。

 

和海轮讨论了下,他蛮聪明的,恩,方法可行~~

 

对于N^N = X两边取对数

 

N * LOG N = LOGX

 

求出Y = N*LOGN

 

对Y取小数  = z

 

X的最高位与Z的第一个非0位有关(因为10的整数次方的最高位都是1)

 

比如 10^10.5

 

它等于10^10*10^0.5

 

最高位就是10^0.5的最高位

 

SK的代码更强,一行。。。思路都是一样滴。。。

 

#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { long long n; double x,y,z; while( scanf("%lld",&n)!=EOF ) { x = n * log10(n); y = x - (long long int )x; z = pow(10,y); while( (int)z == 0 ) { z *= 10; } printf("%d/n",(int)z); } return 0; }  

 

 

SK的

 

#include <iostream> #include <cmath> #define DEBUG 1 using namespace std ; int main( ) { double n ; while( EOF != scanf("%lf", &n ) ){ printf("%d/n", ( int )pow( (double)10, n*log10( n ) - (int)( n*log10( n ) ) ) ) ; } return 0 ; }  

你可能感兴趣的:(手机)