NOJ——1659求值(log10取对数+floor取整数部分+可有可无的快速幂)

32 篇文章 0 订阅
15 篇文章 0 订阅
  • [1659] 求值

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • 给你三个数a,b,c,求a的b次的前c位数(不够c位输出全部即可)
  • 输入
  • 输入数据有多组,每组占一行,有三个整数,之间有空格。(0<a,b<2147483648,0<c<10)
  • 输出
  • 对于每组输入数据,输出一行.
  • 样例输入
  • 55 20 6
    10 5 2
  • 样例输出
  • 641584
    10

    这题WA好多次,发现是自己乱搞多加了几个1e-8。全去掉就A了。还是C++方便,算法思路均来自于学长,看完临摹了一下而已。

    主要思想:a的b次幂 取前c个数,显然这种题不会是傻瓜式相乘,那可以先把结果变成很小的double实数,然后再通过乘10^n改变小数点来得到答案。因此用到log10,为什么是10?因为10^(n.xxxxx)n次和10^(0.xxxxx)区别只在于小数点的位置即10的倍数关系(由指数和幂运算法则可以得出)又10^(0.xxxxx)会大于0小于1,那简单了,先得到这个大于0小于1的基数,再通过乘以10^n次把他变成答案。

    简洁点就是把a^b表示成10^n,再看n和题中c的大小来确定答案。

    #include<iostream>
    #include<cstdio> 
    #include<cmath> 
    using namespace std;
    typedef __int64 ll;
    ll POW(const ll &a,ll b)//快速幂,但是这题指数很小,基本没用就当练习吧
    {
        ll r=1,base=a;
        while(b!=0)
        {
            if(b&1)
                r=r*base;
            base=base*base;
            b>>=1;
        }
        return r;
    }
    int main (void)  
    {  
    	ll a,b,c;
    	double zhishu1,zhishu2;
    	ios::sync_with_stdio(false);//取消同步加速(这题并没什么卵用)
    	while (cin>>a>>b>>c)
    	{
    		zhishu1=b*log10((double)a);//log运算把指数放前面,因此可以将a^b表示成10^n即a^b=10^zhishu1
    		if(zhishu1>=(double)(c))//位数和指数的大小关系
    		{
    			zhishu2=zhishu1-floor(zhishu1);
    			cout<<(ll)(pow(10.0,zhishu2) * (double)POW(10,c-1))<<endl;
    		}
    		else 
    			cout<<POW(a,b)<<endl;
    	}
        return 0;
    }  
    
    
    


     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值