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


    NNNNN

    Time Limit: 2000/1000ms (Java/Others)

    Problem Description:

    对于整数N,求N^N的前5位和后5位(1057题加强版)

    Input:

    多组测试数据,每组测试数据输入为一个整数n(6 <= n <= 10^9),n为0时结束。

    Output:

    对每组测试输出为两个整数a和b,由空格隔开,保留前后0,格式见样例。

    Sample Input:

    6
    10
    110
    1001
    0

    Sample Output:

    46656 46656
    10000 00000
    35743 00000
    27196 01001
    解题思路:①怎么求N^N的前5位数呢?我们有对一个数N,用科学计数法表示为N=a*10^m,此时a的整数部分即为N的最高位数字。假设b是最高位数字(0<b<10,b取整数),则a=b*10^4就是N^N的前五位数,所以N^N=b*10^m=a*10^(m-4),两边取对数得N*lg(N)=lg(b)+m=lg(a)+m-4;因为0<b<10(b取整数),所以0<=lg(b)<1为小数部分。令x=lg(b)+m=lg(a)+m-4(m为x的整数部分m=floor(x)),x=N*lg(N),则a=10^(x+4-m)=10^(x+4-(floor)x);这里用floor比较好,向下取整(而不是int,或者long long,这样可以避免溢出),即返回不大于x的最大整数。
    pow(x,y)函数计算x的y次幂。②至于求后5位数就更简单了,快速幂取余即可。
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 int mod_pow(LL base,LL n,int mod){
     5     LL res=1;
     6     while(n>0){
     7         if(n&1)res=res*base%mod;
     8         base=base*base%mod;
     9         n>>=1;
    10     }
    11     return res;
    12 }
    13 int main()
    14 {
    15     int n;
    16     while(cin>>n && n){
    17         printf("%0.0f %05d
    ",pow(10,n*log10(n)-floor(n*log10(n))+4),mod_pow(n,n,100000));
    18     }
    19     return 0;
    20 }
  • 相关阅读:
    Bash基本语法
    安装Ifconfig
    Centos6版本升级
    使用Lombok简化你的代码
    二、快速起步(Mysql镜像)
    一、Docker之旅
    logback.xml日志配置
    mybatis动态SQL标签的用法
    你不知道的Java类
    系统管理员需知的 16 个 iptables 使用技巧
  • 原文地址:https://www.cnblogs.com/acgoto/p/9017451.html
Copyright © 2020-2023  润新知