当前位置: 首页 > news >正文

输出圆周率的前n位数字

介绍说明

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

运行截图

代码运行截图

完整代码


#include <iostream>class TeamWorkBigInt
{
private:static const int digits = 10000;short integer[digits];
public:int sign = 1;TeamWorkBigInt(long = 0); // 构造friend TeamWorkBigInt operator+(const TeamWorkBigInt&, const TeamWorkBigInt&);//两个大数相加TeamWorkBigInt operator+(int) const;//大数加intTeamWorkBigInt operator-(const TeamWorkBigInt&) const;int operator > (const TeamWorkBigInt&) const;int operator>=(const TeamWorkBigInt& op2) const;int operator==(const TeamWorkBigInt& op2) const;TeamWorkBigInt operator * (const TeamWorkBigInt&) const;TeamWorkBigInt operator * (int) const;TeamWorkBigInt operator / (int);TeamWorkBigInt operator / (const TeamWorkBigInt&);TeamWorkBigInt& operator = (int);TeamWorkBigInt& operator /= (int);friend  TeamWorkBigInt pow(TeamWorkBigInt a, int b);int getLength() const;explicit TeamWorkBigInt(int i);TeamWorkBigInt& operator+=(const TeamWorkBigInt& a);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++;}
}std::ostream& operator<<(std::ostream& os, const TeamWorkBigInt& bigInt) {int length = bigInt.getLength();for (int i = length - 1; i >= 0; --i) {os << bigInt.integer[i];}return os;
}int TeamWorkBigInt::getLength() const {int length = 0;// 从最高位开始向低位检查,找出有效的数值位  for (int i = digits - 1; i >= 0; --i) {if (integer[i] != 0) {length = i + 1; // 有效位数为最后一个非零位的索引 + 1  break;}}return length; // 返回有效位数  
}TeamWorkBigInt operator+(const TeamWorkBigInt& op2, const TeamWorkBigInt& op3)
{if (op2.sign == -1 && op3.sign == -1 || op2.sign == 1 && op3.sign == 1){TeamWorkBigInt temp;int carry = 0;for (int i = 0; i < TeamWorkBigInt::digits; i++){temp.integer[i] = op2.integer[i] + op3.integer[i] + carry;if (temp.integer[i] > 9){temp.integer[i] -= 10;carry = 1;}elsecarry = 0;}return temp;}else if (op2 > op3){TeamWorkBigInt temp;int carry = 0;for (int i = 0; i < TeamWorkBigInt::digits; i++){temp.integer[i] = op2.integer[i] - op3.integer[i] - carry;if (temp.integer[i] < 0){temp.integer[i] += 10;carry = 1;}elsecarry = 0;}temp.sign = op2.sign;return temp;}else{TeamWorkBigInt temp;int carry = 0;for (int i = 0; i < TeamWorkBigInt::digits; i++){temp.integer[i] = op3.integer[i] - op2.integer[i] - carry;if (temp.integer[i] < 0){temp.integer[i] += 10;carry = 1;}elsecarry = 0;}temp.sign = op3.sign;return temp;}}TeamWorkBigInt TeamWorkBigInt::operator+(int op2) const
{TeamWorkBigInt temp;int carry = 0;for (int i = 0; i < digits; i++){temp.integer[i] = integer[i] + op2 % 10 + carry;op2 /= 10;if (temp.integer[i] > 9){temp.integer[i] -= 10;carry = 1;}elsecarry = 0;}return temp;
}TeamWorkBigInt TeamWorkBigInt::operator-(const TeamWorkBigInt& op2) const
{TeamWorkBigInt temp;int carry = 0;for (int i = 0; i < digits; i++){temp.integer[i] = integer[i] - op2.integer[i] - carry;if (temp.integer[i] < 0){temp.integer[i] += 10;carry = 1;}elsecarry = 0;}return temp;
}int TeamWorkBigInt::operator>(const TeamWorkBigInt& op2) const
{int i = digits - 1;while (integer[i] == op2.integer[i] && i >= 0)i--;if (i == -1)return 0;else if (integer[i] > op2.integer[i])return 1;elsereturn 0;
}int TeamWorkBigInt::operator>=(const TeamWorkBigInt& op2) const
{int i = digits - 1;while (integer[i] == op2.integer[i] && i >= 0)i--;if (i == -1)return 1;else if (integer[i] > op2.integer[i])return 1;elsereturn 0;
}int TeamWorkBigInt::operator==(const TeamWorkBigInt& op2) const
{int i = digits - 1;while (integer[i] == op2.integer[i] && i >= 0)i--;if (i == -1)return 1;elsereturn 0;
}TeamWorkBigInt TeamWorkBigInt::operator*(const TeamWorkBigInt& op2) const {TeamWorkBigInt temp;int carry = 0;for (int i = 0; i <= this->getLength(); i++) {for (int j = 0; j <= op2.getLength(); j++) {if (i + j < digits) {temp.integer[i + j] += integer[i] * op2.integer[j] + carry;carry = temp.integer[i + j] / 10;temp.integer[i + j] %= 10;}}}return temp;
}TeamWorkBigInt TeamWorkBigInt::operator/(int  op2) {TeamWorkBigInt temp = *this;if (op2 < 0) {op2 = -op2;temp.sign = temp.sign * -1;}int temptemp;int carry = 0;for (int i = getLength() - 1; i >= 0; i--) {temptemp = temp.integer[i] + carry * 10;temp.integer[i] = temptemp / op2;carry = temptemp % op2;}return temp;}TeamWorkBigInt& TeamWorkBigInt::operator=(const int b) {for (short& j : integer) {j = 0;}int a = b;int k = 0;while (a != 0) {integer[k] = a % 10;a /= 10;k++;}return *this;
}TeamWorkBigInt::TeamWorkBigInt(int i) {for (short& j : integer) {j = 0;}int k = 0;while (i != 0) {integer[k] = i % 10;i /= 10;k++;}}TeamWorkBigInt& TeamWorkBigInt::operator+=(const TeamWorkBigInt& a) {if (a.sign == -1) {TeamWorkBigInt b = a;b.sign = 1;*this = *this - b;return *this;}int carry = 0;for (int i = 0; i < digits; i++) {integer[i] += a.integer[i] + carry;if (integer[i] >= 10) {integer[i] -= 10;carry = 1;}else {carry = 0;}}return *this;
}TeamWorkBigInt& TeamWorkBigInt::operator/=(const int b) {int carry = 0;int a = -b;int temp;for (int i = getLength() - 1; i >= 0; i--) {temp = integer[i];integer[i] = (integer[i] + carry * 10) / a;carry = (temp + carry * 10) % a;}sign *= -1;return *this;
}TeamWorkBigInt TeamWorkBigInt::operator/(const TeamWorkBigInt& a) {TeamWorkBigInt temp = *this;int num = a.getLength() - 1;for (int i = 0; i < getLength(); i++) {temp.integer[i] = integer[i + num];}for (int i = getLength(); i < digits; i++)temp.integer[i] = 0;return temp;
}TeamWorkBigInt TeamWorkBigInt::operator*(int a) const {TeamWorkBigInt temp;int carry = 0;for (int i = 0; i <= this->getLength(); i++) {temp.integer[i] += integer[i] * a + carry;carry = temp.integer[i] / 10;temp.integer[i] %= 10;}return temp;
}TeamWorkBigInt pow(TeamWorkBigInt a, int b) {TeamWorkBigInt temp;temp.integer[b] = 1;return temp;
}int main()
{int i, N;TeamWorkBigInt  n = 10, b, x1, x2, s, t, pi;std::cin >> N;N--;b = pow(n, N + 10);x1 = b * 4 / 5;x2 = b / -239;s = x1 + x2;for (i = 3; i <= N * 2; i += 2){x1 /= -25;x2 /= -57121;t = (x1 + x2) / i;s += t;}pi = s * 4;std::cout << (pi / pow(n, 10)) << std::endl;return 0;
}
http://www.xdnf.cn/news/192151.html

相关文章:

  • 出口转内销如何破局?“金融+数智供应链”模式含金量还在上升
  • OpenHarmony - 小型系统内核(LiteOS-A)(十三),LMS调测
  • 文献阅读(一)植物应对干旱的生理学反应 | The physiology of plant responses to drought
  • 早投早发表!3本 Nature 新子刊已开放投稿系统!
  • 【前端】从零开始的搭建顺序指南(技术栈:Node.js + Express + MongoDB + React)book-management
  • 97AB-ASEMI机器人功率器件专用97AB
  • transformer-实现单层encoder_layer
  • JavaScript性能优化实战(6):网络请求与资源加载优化
  • 优化MySQL性能:主从复制与读写分离实践指南
  • 设计模式(行为型)解释器模式
  • 用Python做有趣的AI项目5:AI 画画机器人(图像风格迁移)
  • 蓝牙耳机开发--TWS蓝牙耳机双向通信充电盒设计
  • 0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目
  • DeepSeek+Dify之三工作流引用知识库案例
  • 第十四章-PHP与HTTP协议
  • Async/Await 必须使用 try/catch 吗?
  • 大模型如何应对内容安全:原理、挑战与技术路径探讨
  • Webug4.0通关笔记02- 第2关布尔注入与第3关延时注入
  • ubantu18.04(Hadoop3.1.3)之Flink安装与编程实践(Flink1.9.1)
  • PostgreSQL与MySQL哪个适合做时空数据分析?
  • 安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
  • 信创时代技术栈选择与前景分析:国产替代背景下的战略路径与实践指南
  • 穷鬼计划:react+tailwindcss+vercel
  • Git-基本操作
  • 【MCP Node.js SDK 全栈进阶指南】高级篇(1):MCP多服务器协作架构
  • 15、项目搭建:绘制城堡蓝图——React 19 工程配置
  • Linux网络编程:TCP多进程/多线程并发服务器详解
  • OceanBase数据库-学习笔记4-租户
  • 100%提升信号完整性:阻抗匹配在高速SerDes中的实践与影响
  • 7、langChain和RAG实战:基于LangChain和RAG的常用案例实战