Live2d Test Env

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



posted @ 2017-09-27 21:06  nimphy  阅读(87)  评论(0编辑  收藏  举报