`

HDU 1060 Leftmost Digit .

 
阅读更多

Leftmost Digit

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5483    Accepted Submission(s): 2080

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
2 3 4
 

 

Sample Output
2 2
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.
 

 

Author
Ignatius.L
 
第一次睇到呢个题目,以为系高精度求幂,然后取第一位…………摆左好耐都无做过,琴日见到华神http://972169909-qq-com.iteye.com/提到
可以利用科学计数法黎做。
众所周知,科学计数法其实就系一个数n = delta * 10^k
题目可以转化为:n^n = delta * 10^k
 
注意到delta个位数部分其实就系最左面既数字,所以我地只要得到delta就咩都搞掂晒啦。
 
所以集合科学计数法后面为10的幂次呢个特点,我地作如下神变:
 
n^n = delta * 10^k
log(n^n) = log(delta * 10^k)
n * log(n) = log(delta) + k
k = floor(n * log(n))
log(delta) = n * log(n) - k = n * log(n) - floor(n * log(n));
delta = 10^(n * log(n) - floor(n * log(n)))
 
求出delta之后,直接int或者floor取整就ok,log(n^n)之所以化成n*log(n)系因为精度问题,n^n会点大家心照啦{= =+}。
k为10既整数幂次,所以显然k = floor(n * log(n)),呢度一定要用floor而唔系int强制转换因为会出错,至于点解会出错,
原因好简单,就系强制double转换int时候既精度缺失{= =},依个系由浮点数储存机制造成,原理可以参考百*百科或者
伪基百科,呢度懒得9up{= =+}。
 
下面献上代码:
4222331 2011-07-20 10:22:04 Accepted 1060 0MS 272K 493 B C++ 10SGetEternal{(。)(。)}!
#include <cmath>
#include <iostream>
using namespace std;

int main()
{
 int    T;
 double n;

 scanf("%d", &T);
 while (T--)
 {
  scanf("%lf", &n);

#if 0
  printf("test = %lf\n", n * log10(n) - floor(n * log10(n)));
#endif

  //n = n / pow(10, log10(n));
  printf("%d\n", (int)pow(10.0, n * log10(n) - floor(n * log10(n))));
 }
 return 0;
}

/*
n^n = delta * 10^k
log(n^n) = n * log(n) = log(delta) + k
log(delta) = n * log(n) - k = n * log(n) - floor(n * log(n));
*/
 
多谢收睇{= =*}
分享到:
评论

相关推荐

    杭电操作系统实验 HDU操作系统实验.zip

    杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU操作系统实验.zip杭电操作系统实验 HDU...

    大学期间操作系统实验-HDU操作系统实验.zip

    HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-HDU操作系统实验.zip大学期间操作系统实验-...

    hangdianACM.rar_hangdiana_hdu acm_www.hangdianacm_杭电

    这个压缩文件包含的是作者个人提交并解决的ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)题目,这些题目来源于HDU的在线编程平台。 【描述】"杭电的一些acm题目,都是我自己一个一...

    HDU-ACM课件.rar

    HDU-ACM课件.rar 是一个专门为编程竞赛爱好者准备的资源包,主要涵盖了ACM(国际大学生程序设计竞赛)中常见的算法知识。这个压缩包包含了一系列与算法相关的主题,旨在帮助初学者理解和掌握基础及进阶算法。下面将...

    算法-数塔(HDU-2084).rar

    标题中的“算法-数塔(HDU-2084)”是指一个编程竞赛题目,源自杭州电子科技大学(HDU)的在线编程平台。在这个问题中,参赛者被要求解决一个名为“数塔”的算法挑战。数塔问题通常涉及到递归、深度优先搜索(DFS)...

    HDU-1535-.zip_多源点

    标题中的"HDU-1535-.zip_多源点"表明这是一个关于解决 ACM (国际大学生程序设计竞赛)问题的程序代码包,问题编号为 HDU 1535,且该问题涉及到多源点的最短路径计算。描述中提到的"求多源点到单终点的最短路(反向...

    算术(HDU-6715).rar

    标题中的“算术(HDU-6715)”很可能是指一个编程竞赛或在线教育平台上的一个问题或挑战,通常这类题目会涉及到算法和数学的应用。由于没有具体的标签信息,我们将根据题目标题和可能的内容来推测相关的IT知识点。 ...

    算法-确定比赛名次(HDU-1285).rar

    《算法-确定比赛名次(HDU-1285)》 算法是计算机科学的基础,也是解决复杂问题的关键工具。在这个问题中,我们聚焦于一个具体的算法挑战——确定比赛名次,这个问题来源于HDU(杭州电子科技大学)的在线编程竞赛...

    最短路(HDU-2544).rar

    《最短路问题详解》 在计算机科学领域,最短路问题是一个经典的图论问题,其目标是寻找网络中两点间路径的最小成本。这个问题在众多应用中都有所体现,如交通规划、通信网络设计、社交网络分析等。...

    数字图像处理总ppt_hdu_许老师.pdf

    数字图像处理是计算机科学和信息技术领域中的一种重要技术,涉及到图像处理、图像分析和图像识别等方面。下面是根据给定的文件信息生成的相关知识点: 1. 数字图像的定义和分类:数字图像是指使用数字信号表示的...

    高级计算机图形学_mm的_重点笔记_hdu_吴xy.pdf

    高级计算机图形学重点笔记 本资源摘要信息主要介绍了高级计算机图形学的重点知识点,涵盖了坐标变换、视图变换、投影变换、设备变换、视窗变换、消隐方法、光照明计算、光线跟踪、shading 方法等方面。...

Global site tag (gtag.js) - Google Analytics