zoj2277 The Gate to Freedom
题目大意,对n, 求n^n的最左边一位数的大小;
如 f(3)=27,ans=27/10=2;
f(4)=256,ans=256/10/10=2;
······
普遍地,对于 f(x),ans=f(x)/(10^k);10^k<=f(x),当k最大时得到答案;
所以取对数 log10(f(x))=k+log10(f(x)%(10^k)),k为整数,log(···)为零头,再用pow(10,log(···))得到anwser。
——————————————————— 分歌线———————————————————————————
这道题如果用while(sacnf(····))就超市了,
而用while(~scanf(····))只要20ms(mmgp)。。。
可以经常在ACM代码中看到 while(~scanf("%d",&n)){ } 这样的代码,意思是在读到输入结尾时循环也结束。
一般在读到输入流结尾时,scanf返回的是EOF。
EOF是在头文件stdio中定义的常量,一般为-1。
-1 的原码是10000001,反码是1111110,补码是11111111。复习一下,正数的原码、反码、补码都是一样的;负数的原码是符号位为1,反码是(对原码)符号位不变、其余位取反,补码是(对原码)符号位不变、其余位取反、末位加1.
~EOF则是对EOF进行按位取反操作,则为00000000。所以while条件不满足,循环结束。
#include<cstdio>
#include<cstdlib>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n)){
double t=(double)n*log10(n);
t=t-int(t);
t=pow(10,t);
printf("%d\n",(int)t);
}
return 0;
}
It is your time to fight!