HDU 1060 Leftmost Digit

本文介绍了一种使用对数法解决大数运算问题的方法,通过将大数转换为对数形式,避免了直接处理大数所带来的复杂度。文中提供了一个具体的C++实现示例,包括如何使用__int64类型进行大数运算。

基本思路:(参考大神和加自己的思考)

考虑到此题需要输入这么大的数a,并且还的求aa,求出来会更大,更多位。当时考虑用大数方法求(数组实现),结果实现不行。看网上大神采用对数法,巧妙避开处理这么大的数。 这就是数学的魅力!!

假如aa=b,两边同时取对数alog10a=log10b,从而有b=10alog10a.现在我们关注点在10alog10a,先举例:一个数2310,这个数,换成10c次幂,这里的c=3.xxxxx.如果把他取整一定为3,103是最大的权值,那剩下的100.xxxxx取整之后就是所求的最高位的基。

 

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n;
    cin>>n;
    __int64 d,b;//int型不行  
    double a,c;
    while(n--)
    {
        unsigned long m;
        cin>>m;
        a=m*log10(m*1.0);//alog10a
        b=(__int64)a;//取整 
        c=a-b;//0.xxxxx 
        d=(__int64)pow(10.0,c);//10^0.xxxxx 取整 
        cout<<d<<endl;        
    }
    return 0;
}

下面介绍一下__int64:

在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf("%lld",a),printf("%I64d",a),和cout << a三种方式。

还有几点:

  1. long long定义方式可以用于gcc/g++,不受平台限制,但不能用于VC6.0。
  2. __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
  3. "%lld"用于Linux i386平台编译器,"%I64d"用于Win32平台编译器。
  4. cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。

 

详细请见:https://www.byvoid.com/blog/c-int64/

转载于:https://www.cnblogs.com/wft1990/p/5873328.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值