题解:P10446 64位整数乘法

· · 题解

大家好,是今天来给大家讲解一下c++中一种比 long long还大的数据类型,__int128!!

首先看数据,肯定炸 long long 了,写高精?不,看数据范围p的大小最多只有 10^{18},而 __int128 最多可以表示 10^{39} 左右的数,然而 __int128 需要手写输入输出,那就我们一起来写一下吧!

首先输入放一下代码:

快读:

__int128 read()
{
   string arr;
    cin >> arr;//输入
    __int128 res = 0;
    int sign = 1;  
    if (arr[0] == '-') //如果是负数
    {
        sign = -1;
        for (int i = 1; i < arr.size(); ++i) //把负号过滤掉
        {
            res = res * 10 + (arr[i] - '0');//__int128是支持加减乘除的,所以我们直接把字符串转换为__int128就可以了
        }
    } else //不是负数
    {
        for (int i = 0; i < arr.size(); ++i) 
        {
            res = res * 10 + (arr[i] - '0');//同上
        }
    }
    return res * sign;//是负数的话会返回负数,否则返回整数
}

快写:

void print(__int128 num)
{
    if (num < 0) 
    {
        putchar('-');//小于0输出符号
        print(-num);//递归,返回-num
    } 
    else if (num > 9) //大于等于10
    {
        print(num / 10);
        putchar(num % 10 + '0');
    } 
    else 
    {
        putchar(num + '0');//直接输出,__int128类型的数是不可以直接cout的!
    }
}

快读快写使用方式

#include<bits/stdc++.h>
using namespace std;
__int128 read()
{
    char arr[100];
    cin >> arr;
    __int128 res = 0;
    int sign = 1;  
    if (arr[0] == '-') 
    {
        sign = -1;
        for (int i = 1; i < strlen(arr); ++i) 
        {
            res = res * 10 + (arr[i] - '0');
        }
    } else 
    {
        for (int i = 0; i < strlen(arr); ++i) 
        {
            res = res * 10 + (arr[i] - '0');
        }
    }
    return res * sign;
}

void print(__int128 num)
{
    if (num < 0) 
    {
        putchar('-');
        print(-num);
    } 
    else if (num > 9) 
    {
        print(num / 10);
        putchar(num % 10 + '0');
    } 
    else 
    {
        putchar(num + '0');
    }
}

main()//其实就是 int main()另一种写法
{
    __int128 a,b;
    a=read();
    b=read();
    print(a+b);
    return 0;
}

好了,快读快写的代码和使用方式知道了,代码就很简单了,只需要把改一下读入数据,输出方式就可以了!代码就不放了。

AC纪录