IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-07-23 C++ primer 16.41:编写一个新的 sum 版本,它的返回类型保证足够大,足以容纳加法结果 -> 正文阅读

[C++知识库]2021-07-23 C++ primer 16.41:编写一个新的 sum 版本,它的返回类型保证足够大,足以容纳加法结果

c++ primer 16.41:编写一个新的 sum 版本, 它的返回类型保证足够大,足以容纳加法结果

这道题的难点不是模板,而是C++如何处理超大数。示例中,当一个数位数太大,编译器就不可识别了,比如45位的123456789123456789123456789123456789123456789。

不要说加,就是储存都是个问题。会转为2^128-1这么个数。其实这也是天文数字了。奈何还会出问题。在windows mingw64 下,也没有可输出重载符号"<<"。

莫不是要重新撸个超大数类?转换存储输出,不是问题,计算是个问题,数学不好就不要挑战了。所以还是不要造轮子了,直接找库,例如boost高精度库。<boost/multiprecision/cpp_int.hpp> 确实比较占空间,至于要不要用,随你吧。

因为没有找到直接将一个巨大数转换成cpp_int类,只好通过函数通过string进行转换。如果要处理巨大数,比如加密动辄256位什么的,可以考虑。这个类有int1024_t,二的一千多次方,但不止这么大,通过定义模板实参类型,可以近乎无限扩大,比如我就实现了一个uint2048_t ,应该够用了。

    using uint2048_t =
        boost::multiprecision::number<
            boost::multiprecision::cpp_int_backend<
                2048, 2048, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;

    using LLint = uint2048_t;
    using Lint = boost::multiprecision::int1024_t;
#include <string>
#include <boost/multiprecision/cpp_int.hpp>
#include "bigint.h"

using namespace std;

template <typename T, typename S>
auto sum(T a, S b) -> decltype(a + b)
{
    return a + b;
}

int main()
{
    auto i = sum(4, 0.2);
    auto j = sum(123456789123456789123456789123456789123456789, 123456789123456789123456789123456789123456789);
    auto k = sum(bigint::stoLint("123456789123456789123456789123456789123456789"), bigint::stoLint("123456789123456789123456789123456789123456789"));

    std::cout << i << std::endl;
    std::cout << j << std::endl;//编译错误,没有可以加载int_128类型的<<操作符。
    std::cout << k << std::endl;

    return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:15:53  更:2021-07-24 11:16:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 16:52:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码