• LightOJ 1282 Leading and Trailing(求n^k的前三位)


    题意:给你一个数n,让你求这个数的k次方的前三位和最后三位

    大体思路:后三位直接用快速幂即可

    求前三位则需要一些数学知识对于给定的一个数n,它可以写成10^a,其中这个a为浮点数,则n^k=(10^a)^k=10^a*k=(10^x)*(10^y);其中x,y分别是a*k的整数部分和小数部分,对于t=n^k这个数,它的位数由(10^x)决定,它的位数上的值则有(10^y)决定,因此我们要求t的前三位,只需要将10^y求出,在乘以100,就得到了它的前三位。
    fmod(x,1)可以求出x的小数部分。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 
     5 using namespace std;
     6 
     7 int length(long long n)
     8 {
     9     return (int)log10(n)+1;
    10 }
    11 
    12 
    13 long long quick1(long long a,long long b)
    14 {
    15     int s=1;
    16     while(b>0)
    17     {
    18         if(b%2==1)
    19         {
    20             s=s%1000;
    21             a=a%1000;
    22             s=s*a;
    23         }
    24         a=a*a%1000;
    25         b=b>>1;
    26 
    27     }
    28     return s;
    29 }
    30 
    31 int main()
    32 {
    33     ios::sync_with_stdio(false);
    34     int T;
    35     long long a,b;
    36     cin>>T;
    37     for(int i=1;i<=T;i++)
    38     {
    39         cin>>a>>b;
    40         int s=quick1(a,b);
    41         if(length(s)>3)
    42         {
    43          s=quick1(a,b)%1000;
    44         }
    45         double x=pow(10.0,fmod(b*log10(1.0*a),1));
    46         //fmod()函数求出小数部分,log10(1.0*a)则为10^a的小数部分
    47         //fmod(x,y)函数即计算x/y的余数
    48         x=x*100.0;
    49         printf("Case %d: %d %03d
    ",i,(int)x,s);
    50     }
    51 
    52     return 0;
    53 }
  • 相关阅读:
    linux信号
    APM浅析
    Jackson高并发情况下,产生阻塞
    [转]slf4j 与log4j 日志管理
    2015-09-27 git学习
    MySQL学习笔记-锁相关话题
    MySQL学习笔记-MySQL数据库优化实践[转]
    MySQL学习笔记-事务相关话题
    几个关于网站架构和性能的问题(我在知乎上的问答)
    MySQL学习笔记-数据库文件
  • 原文地址:https://www.cnblogs.com/Fy1999/p/8891690.html
Copyright © 2020-2023  润新知