hdu 1060

来源:互联网 发布:cocos2dx v3.10 mac 编辑:程序博客网 时间:2024/05/14 14:41

第一次写博客 ,只是想把最近写的题,看到的题的思路做一下记录,方便以后查找,因为有时候一些题看过、理解后,几天过后又忘了,怎么说呢,开这个博客目前 的功能还是以记录自己在做题时在网上找到的一些解题思路或者是自己的解题心得(因为目前是小白,估计这部分会很少出现23333)为主把。以后会有什么功能,就以后再说把,还是很希望自己能成为一名优秀的程序员2333.

 好嘞,应该说点正事了吧.......

———————————————华丽丽的分割线————————————————————

Problem Description
Given a positive integer N, you should output the leftmost digit of N^N.
 
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
 
Output
For each test case, you should output the leftmost digit of N^N.
 
Sample Input
234
 
Sample Output
22
Hint
In the first case, 3 * 3 * 3 = 27, so the leftmost digit is 2.In the second case, 4 * 4 * 4 * 4 = 256, so the leftmost digit is 2.

 

这个题目跟我寒假看到的一个题目非常相似,这道题求的是阶乘后的最高位,而之前那道题求的却是最低位,嗯。。。如果待会可以找到的话,我会新开一篇博客记一下思路,试着进行比较。先说一下这道题~

跟往常一样,打开了discuss,发现大家都套用了一个公式lgn=x+lgm,然而却没有解释这道公式怎么来的,所以我就百度了一下,所以我在下面记录一下在博客中了解到的推导

首先呢,任何一个数用科学记数法都可以记成num=a*10^n,其中0<=a<10, 所以num^num=a*10^n,然后对两边同时取对数,得numlgnum=lga+n,(其中a的整数部分就是题目要求的最高位啦),然后x=numlgnum,由于0<=lga<1,n>=0,所以 n为x的整数部分,lga为小数部分,lga=x-n=x-int(x),可得出a=10^(x-int(x)),所以int(a)就是要求的最高位啦

接下来附上我的代码(很丑,见怪不怪)

  

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
 int a,t;
 double x;
 long double num;
 cin>>t;
 while(t--)
 {
  cin>>num;
  x=num*log10(num);
  a=pow(10.0,(x-(long long)(x)));//此处x要用long型,防止溢出
  cout<<a<<endl;
 }


}

 基本都字母跟解释里一模一样,就不用写解释了,然后这道题跟很多acm题目一样,都要注意一下溢出问题,num的范围是0~1,000,000,000;所以用int显然不行,所以用long long比较合理。num之所以是用long double,是因为那个log10函数是不能用long long型的。

 

 

 

 

嗯~~这道题的思路大概就这样了,已经快十二点了,另外一道题就等明天再找吧(希望还记得,嗯~~),虽然即将成为一名程序员,但是还是不希望自己熬夜修仙的2333.况且现在还感冒着呢。就先这样了,希望这第一条博客能为自己起个好头把,fighting~~

 

 

 

——————————Be more better, Try to do more, Do what I want , Believe myself, Be more curious!!!

                                                                                    

1 0