int_128的用法(可以用于替代高精度)
作者:
Snrise
,
2024-04-04 20:48:59
,
所有人可见
,
阅读 11
/*
read函数的工作原理如下:
初始化w为1,x为0。w用于存储数字的符号,x用于存储数字的绝对值。
使用getchar函数读取一个字符。如果这个字符不是数字(即不在'0'到'9'之间),那么就检查这个字符是否是'-'。如果是'-',那么就将w的值取反。然后继续读取下一个字符,直到读取到一个数字。
当读取到一个数字时,就将这个数字加入到x中。具体的操作是先将x乘以10,然后加上当前字符代表的数字(通过ch - '0'计算得到)。然后继续读取下一个字符,直到读取到一个非数字。
最后,返回w * x,即输入的数字。如果输入的是负数,那么w会是-1,所以w * x也会是负数。
write函数的工作原理如下:
这个函数接受一个__int128_t类型的参数x,然后将它输出到标准输出。
由于__int128_t类型的数据不能直接用printf或cout输出,所以这个函数使用了一个递归的方法来输出x的每一位数字。
具体的方法是,如果x大于9,那么就先输出x除以10的结果(即去掉x的最后一位),然后再输出x的最后一位。这样就可以确保数字的每一位都被正确地输出。
最后,这个函数使用putchar函数来输出x的最后一位。putchar函数接受一个字符作为参数,所以这里需要将x的最后一位转换为字符,具体的操作是x % 10 + '0'。
*/
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#define endl '\n'
#define int long long
typedef __int128_t i128;
using namespace std;
i128 read()
{
i128 w = 1, x = 0;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
{
w = -w;
}
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return w * x;
}
void write(i128 x)
{
if (x < 0)
{
putchar('-');
x = -x;
}
if (x > 9)
{
write(x / 10);
}
putchar(x % 10 + '0');
}
signed main(void)
{
i128 x;
x = read();
write(x);
putchar('\n');
}