当前位置: 首页 > 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;
}

相关文章:

  • 含锡废水综合治理技术解析
  • Electron 入门指南
  • 【ACL系列论文写作指北08-图表设计规范】-让数据与结构一目了然
  • 深入探究C++ 中的stack、queue和deque
  • 数据结构之顺序表
  • Flask + ajax上传文件(四)--数据入库教程
  • 在自动驾驶数据闭环中的特征工程应用
  • JAVA-StringBuilder使用方法
  • vue代码规范管理
  • html css js网页制作成品——HTML+CSS甜品店网页设计(4页)附源码
  • 花费7元训练自己的GPT 2模型
  • 数组滑动窗口单调栈单调队列trick集【leetcode hot100 c++速查!!!】
  • 【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)
  • Python-librosa库提取音频数据的MFCC特征
  • 推荐私有化部署的企业内部通讯软件BeeWorks
  • 短视频矩阵系统贴牌批量剪辑功能开发,支持OEM
  • 反射与注解实现动态功能扩展案例-插件系统
  • 基于RSSI原理的Wi-Fi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用CKF进行滤波,附完整的代码,可复制粘贴
  • 探索 Redis 缓存对系统性能的提升——项目启动与操作指南
  • 论文导读 - 基于边缘计算、集成学习与传感器集群的便携式电子鼻系统
  • 人到中年为何腰围变粗?科学家发现腹部脂肪增加的细胞元凶
  • 新造古镇丨上海古镇朱家角一年接待164万境外游客,凭啥?
  • 广东雷州农商行董事长、原行长同日被查
  • 中国贸促会:有近50%的外贸企业表示将减少对美业务
  • 国内生产、境外“游一圈”再进保税仓,这些“全球购”保健品竟是假进口
  • 杭州打造商业航天全产业链,请看《浪尖周报》第22期