假设我们现在需要知道 ab  的后 n 位数或前 n 位数,简单直观的做法就是求出 ab  的值,然后在分别取前 n位或后 n位,不过在 a,b很大的情况下显然是无法存储的。所以,直接求是不可能的了。

  让我们先来看看后 n 位如何求?因为我们只要后 n 位,那么我们都知道把 ab  的值模上一个10n 就是所求。根据求模的性质:ab % n = (a%n)b % n;然后用快速幂跑一遍即可。

  

  1. int QuickPow (__int64 a, __int64 b)
  2. {
  3. __int64 r = ;
  4. while (b)
  5. {
  6. if (b&)
  7. r = (r*a) % (__int64)pow(10.0, n*1.0);
  8. a = ( a*a) % (__int64)pow(10.0, n*1.0);
  9. b >>= ;
  10. }
  11. return r;
  12. }

  关键是前 n 如何求?我们假设 ab = c。再设 log10 (c) = d。另 Int 为 d 的整数部分,k 为小数部分,那么 10Int = 100......0(共Int个0),不难发现,除了第一位是1外其余均为0,也就说,10k 最终将直接影响最左边的 N 位数。将这个结果乘以1,就是前1位的答案,乘以10,就是前2位的答案。。。类推!

  后来发现任何一个数字 n 都可以表示成10(a+b) 。其中 a整数,b为小数。例如

    n=87455时,a=4,b=0.941784644.

    有规律.10a =10000.10b =8.7455.

  所以n的左边数起第一位数字。就是10b 的第一位有效数字,第二数字,是10^b的第二位有效数字。。。。以次类推

以hdu 1060为例:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. int t;
  9. __int64 n;
  10. __int64 Int;
  11. double a, d;
  12. scanf("%d", &t);
  13. while(t--)
  14. {
  15. scanf("%I64d", &n);
  16. a = n*log10(n*1.0);
  17. Int = (__int64)a;
  18. d = a - Int;
  19. printf("%I64d\n", (__int64)pow(, d));
  20. }
  21. return ;
  22. }

a^b的前n位数的更多相关文章

  1. ACM_求N^N的前5位数和后5位数(数论)

    NNNNN Time Limit: 2000/1000ms (Java/Others) Problem Description: 对于整数N,求N^N的前5位和后5位(1057题加强版) Input: ...

  2. Python给数字前固定位数加零

    python中有一个zfill方法用来给字符串前面补0,非常有用 n = " s = n.zfill(5) " zfill()也可以给负数补0 n = "-123&quo ...

  3. Java四舍五入时保留指定小数位数

    方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); , BigDecimal.ROUND_HALF_UP).doubleValue(); ...

  4. [hdu 1568] Fibonacci数列前4位

    2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2 ...

  5. java.math.BigDecimal保留两位小数,保留小数,精确位数

    http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题 ...

  6. 第17题:打印1到最大的n位数

    面试题17:打印1到最大的n位数  题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 考点: 用字符串或者数组表达一个大数. 思路 1. ...

  7. ACM_求N^N的最高位数

    Leftmost Digit Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定一个正整数N,你应该输出N ^ N的最左边的数字 ...

  8. java小数保留位数四舍五入

    方法一:四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, Roundin ...

  9. JAVA代码验证身份证信息

    java验证身份证信息代码 转自:http://www.blogjava.net/xylz/archive/2011/01/05/342330.html import java.util.Calend ...

随机推荐

  1. HLS(HTTP Live Streaming)协议之m3u8文件生成方式

    HLS(HTTP Live Streaming)是Apple的动态码率自适应技术.主要用于PC和Apple终端的音视频服务.包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件. HLS ...

  2. 伪协议触发onbeforeunload

    根据MSDN描述,IE的onbeforeunload事件触发条件: 简单点来说就是页面URL发生改变时触发: * 关闭浏览器窗口 * 点击后退.前进.刷新.主页 * 点击链接到新页面 * 调用超链接的 ...

  3. php如何返回一个image文件

    The important points is that you must send a Content-Type header. Also, you must be careful not incl ...

  4. 自定义View—绘制基本图形

    一.Canvas能够绘制哪些图形 二.

  5. QT5.1.0,QT4.8.0以及VC2010、VC2012的测试对比

    QT5.1.0,QT4.8.0以及VC2010.VC2012的交叉测试对比. 测试1: 用VC2012静态编译了QT5.1.0. 编译速度很慢,生成完成后,用VC2012+QT5.1.0进行程序生成, ...

  6. 返回本机的mac物理路径

     /// <summary>         ///    返回本机的mac物理路径         /// </summary>         /// <return ...

  7. Android学习笔记__3__Android应用程序组成

    Android开发必须要了解构造块,Android应用程序是由里有六个重要组成部分组成的,这六种构造块如下:  ◆Activity ◆Intent Receiver ◆Service ◆Content ...

  8. AsyncTask实现登录功能,上传图片,get,post

    提交成功时,从服务器端返回数据“load success” 用户名.密码正确后成功登录,并且在服务器端的文件保存目录上看到了从客户端上传的图片. 客户端代码: MainActivity.java im ...

  9. 自定义一个searchBar

    #import "CZSearchBar.h" @implementation CZSearchBar - (instancetype)initWithFrame:(CGRect) ...

  10. python之路-模块安装 paramiko

    paramiko介绍(全是洋文,看不懂啊,赶紧有道翻译吧,等有朝一日,我去报个华尔街): "Paramiko" is a combination of the esperanto ...