首页 > 编程语言 >【C/C++项目】——高精度计算pi值

【C/C++项目】——高精度计算pi值

时间:2024-06-06 23:31:15浏览次数:25  
标签:const TeamWorkBigInt int 高精度 整数 运算符 C++ operator pi

项目概述

导入

在现代科学研究和技术开发中,高精度的数值计算是不可或缺的。特别是在物理、天文学、密码学等领域,精确的大数运算对于理论模型的验证和应用实现至关重要。我们要做的是利用该类,计算圆周率到数千甚至数万位的精度,展示其处理复杂数学问题的能力。

具体问题描述

32位整数的计算机可以表示整数的范围近似为-20亿到+20亿。在这个范围内操作一般不会出现问题,但是有的应用程序可能需要使用超出上述范围的整数。C++可以满足这个需求,创建功能强大的新的数据类型。根据后缀,定义一个大整数类,实现大整数的加、减、乘、除、幂、输出重载等,并能去计算pi的值。要求:能在两秒内算到1000位。
输入一个整数n,
输出圆周率的前n位数字(不包含小数点)
样例输入
3
样例输入
314
样例输入
1000
样例输出
3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198

想要实现这一功能,我们需要完成如下任务:

  1. 基本算术运算:实现大整数的加、减、乘、除等基本算术运算,支持超出常规整数范围的数值计算。
  2. 运算符重载:通过重载加法、减法、乘法和除法运算符,提供与普通整数类似的操作体验,使得大整数运算直观并易于集成到现有代码中。
  3. 性能优化:针对大数运算进行优化,减少计算时间和资源消耗,特别是在乘法和除法等复杂运算中寻找效率更高的算法。

运行环境及版本

  • 使用软件:DEVC++ 5.11
  • 设置环境
    Alt将gcc配置为32位的目的是为了防止中文乱码;编译时加入 -std=c++11是因为我的代码中包含C++11版本及以上才支持的特性

代码实现(结构清晰,结合注释理解)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class TeamWorkBigInt {
   
private:
    static const int digits = 10000; // 大整数的位数
    short integer[digits]; // 存储大整数的数组
public:
    int sign = 1; // 大整数的符号,默认为正

    // 构造函数,初始化大整数为0或给定的值
    TeamWorkBigInt(long = 0);

    // 重载加法运算符
    friend TeamWorkBigInt operator+(const TeamWorkBigInt &, const TeamWorkBigInt &);

    // 大整数加上一个整数
    TeamWorkBigInt operator+(int) const;

    // 重载减法运算符
    TeamWorkBigInt operator-(const TeamWorkBigInt &) const;

    // 重载比较运算符(大于)
    int operator>(const TeamWorkBigInt &) const;

    // 重载乘法运算符
    TeamWorkBigInt operator*(const TeamWorkBigInt &) const;

    // 大整数乘以一个整数
    TeamWorkBigInt operator*(int) const;

    // 大整数除以一个整数
    TeamWorkBigInt operator/(int);

    // 大整数除以另一个大整数
    TeamWorkBigInt operator/(const TeamWorkBigInt &);

    // 赋值运算符重载
    TeamWorkBigInt &operator=(int);

    // 大整数除以一个整数(改变自身)
    TeamWorkBigInt &operator/=(int);

    // 大整数加上另一个大整数(改变自身)
    TeamWorkBigInt &operator+=(const TeamWorkBigInt &);

    // 计算大整数的指数幂
    friend TeamWorkBigInt pow(TeamWorkBigInt a, int b);

    // 获取大整数的长度(位数)
    int getLength() const;

    // 构造函数,初始化为给定的整数
    explicit TeamWorkBigInt(int i);

    // 重载输出流运算符,用于打印大整数
    friend std::ostream &operator<<(std::ostream &, const TeamWorkBigInt &);
};

// 构造函数实现
TeamWorkBigInt::TeamWorkBigInt(long value) {
   
    for (short & i : integer)
        i = 0;
    int i = 0;
    while (value != 0) {
   
        integer[i] = value % 10;
        value /= 10;
        i++;
    }
}

//

标签:const,TeamWorkBigInt,int,高精度,整数,运算符,C++,operator,pi
From: https://blog.csdn.net/weixin_64259675/article/details/139370728

相关文章

  • 如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中
    如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中前言本教程只面向小白,目的是配置出一个Windows能用的新GCC环境,未深入涉及细节配置。在访问文中链接时,你可能需要使用能更快速访问国际网络的工具。安装MinGW环境先访问MinGW的官网:https://www.mingw-w64.org/......
  • Meta最新路径搜索算法 Beyond A*: Better Planning with Transformers via Search Dyn
    这篇论文前两个月刚刚放出,研究了如何让人工智能(AI)更好地解决复杂的规划问题,比如在迷宫中寻找最短路径,或者推箱子游戏(Sokoban)中把箱子全部推到指定位置。传统上,这类问题通常使用专门的规划算法来解决,比如A*搜索算法。但是,训练AI模型(如Transformer)来解决这些问题......
  • C++缺省参数函数重载
    缺省参数大家知道什么是备胎吗?C++中函数的参数也可以配备胎。3.1缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。voidTestFunc(inta=0){cout<<a<<endl;}intmain(......
  • c++文件读写基础操作
    目录一、文件基础理论二、文本文件1.写文件2.读文件三、二进制文件1.写文件 2.读文件一、文件基础理论        程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放,我们通过文件可以将数据持久化。C++中对文件操作需要包含头文件<fstream>......
  • WebviewController进行混合开发,鸿蒙星河版API(11)
    @ohos.web.webview提供web控制能力,web组件提供网页显示的能力,同时也可以执行网页中定义的JS方法。一、第一步创建WebviewController实例controller:WebviewController=newwebview.WebviewController()二、web组件加载html文件build(){Navigation(){Col......
  • BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and
    Motivation&Abs端到端大规模视觉语言预训练的开销极大。为此,本文提出了BLIP2,利用现成的冻住的imageencoder以及LLM引导视觉语言预训练。模态差距:通过两阶段训练的轻量级的QueryTransformer(Q-Former)弥补。第一阶段:从冻结的imageencoder引导VL学习;第二阶段:从冻结的LLM引导视......
  • Spire.PDF for Java 10.6.0 支持 PDF to SVG, Word and OFD
    Spire.PDFforJava10.6.0enhancestheconversionsfromPDFtoSVG,WordandOFDSpire.DocforJavaisaprofessionalWordAPIthatempowersJavaapplicationstocreate,convert,manipulateandprintWorddocumentswithoutdependencyonMicrosoftWord.B......
  • 高精度地图制作-更新和维护
    高精度地图制作-更新和维护之前有写过一篇高精度地图制作的介绍,后面也思考了一些问题,其中比较困扰我的是高精度地图如何做到实时更新?高精度地图的维护成本?最近看了ZENRIN公司关于高精度地图的介绍PPT[1],得到了很大的启发,简单的做一个学习记录。附赠自动驾驶最全的学习资料......
  • 基于Linux操作系统的生产消费者队列封装(C++)
    一.先前代码及实现(在该篇中会用到)1.基于Linux操作系统的锁的封装-CSDN博客2.基于linux操作系统的线程封装(可实现任意传递任意类型任意个数的参数)-CSDN博客二.生产消费者模型    在一个多线程的进程中,通常存在如下关系生产者和消费者,其中生产者负责生产资源(产生任务......
  • apollo高精度地图标注
    apollo高精度地图标注附赠自动驾驶最全的学习资料和量产经验:链接上一篇文章已经介绍点云地图的制作方法,完成之后就可以得到城市或园区的三维地图了,之后需要标注语义信息,提供给自动驾驶车辆使用。目前暂时没有找到非常好用的开源语义标注工具,本文采用RoadRunner[1],它是商......