设计程序,实现高精度圆周率的计算和存储,使用线性表突破程序设计语言内置变量的数值和有效数字范围限制

一、使用线性表突破程序设计语言内置变量的数值和有效数字范围的限制,为了实现高精度圆周率的计算,先根据数学公式进行对PI高精度运算,如图1-1。根据这个数学公式 π2 = 0nn!2n+1‼ 即 Rn+1=Rn*n2n+1R1=1sum= π=2* n=1Rn 来计算PI值。首先先建立双链表,再对其初始化。根据其特性,实现了对大数的加法,乘法和除法,以此来完成对PI的高精度计算如图1-1,最后将PI的值储存到文件中如图1-2。

#include <stdio.h>
#include <stdlib.h>

// 定义双链表节点结构体
typedef struct list
{
    int data;               // 节点数据域
    struct list *next;     // 指向下一个节点的指针
    struct list *pre;      // 指向前一个节点的指针
}list;

// 初始化双链表,返回链表头节点
list* Initlist()
{
    list *head;
    head = (list*)malloc(sizeof(list)); // 为头节点分配内存
    if (!head)
        exit(EXIT_FAILURE); // 如果内存分配失败,则退出程序
    else
        head->next = head->pre = head; // 初始化头节点的next和pre指针指向自己
    return head;
}

// 创建指定长度的双链表,返回链表头节点
list *Creatlist(list *head)
{
    list *p = head;
    for (int i = 0; i < 1000; i++) // 循环创建1000个节点
    {
        list *q = (list*)malloc(sizeof(list));
        if (!q)
            exit(EXIT_FAILURE); // 如果内存分配失败,则退出程序
        else
        {
            q->data = 0; // 将新节点q的数据域设置为0
            q->pre = p;  // 将新节点q的前置指针指向当前节点p
            p->next = q; // 将当前节点p的下一个节点指针指向新节点q
            q->next = head; // 将新节点q的下一个节点指针指向链表的头节点head,形成一个环形链表
            head->pre = q; // 将头节点head的前置指针指向新节点q,完成环形链表的构建
            p = p->next; // 将当前节点p移动到下一个节点,为下一次循环做准备
        }
    }
    return head;
}

void Save(int n) //存储PI
{
    FILE *fp = fopen("E:\\C语言的软件\\数据结构与算法\\1\\PI的存储.txt","w+");
    fprintf(fp,"%d",n);
    fclose(fp);
}

int main()
{
    int n;
    printf("请输入PI要精确到的位数\n");
    scanf("%d", &n); // 输入需要的小数位数

    list *number, *sum;
    list *p, *q, *x;

    number = Initlist(); // 初始化number链表
    sum = Initlist();    // 初始化sum链表

    number = Creatlist(number); // 创建number链表
    sum = Creatlist(sum);       // 创建sum链表

    number->next->data = 2; // number链表的第二位储存2,即2*R(1)=2
    sum->next->data = 2;   // sum链表的第二位也储存2

    int a = 0, b = 0; // 分别是用来暂时存储进位和余数

    for (int i = 1; i < 2000; i++) // 循环两千次,用于计算π的近似值
    {
        p = number->pre; // 开始大数乘法时从number链表的尾部开始

        while (p != number) //大于10则把10位的数字给b,个位数字放入data域中。
        {   //乘法运算
            a = p->data * i + b; // 计算当前位乘以i加上之前的进位
            p->data = a % 10; // 取个位数放入当前节点的data域
            b = a / 10; // 计算进位
            p = p->pre;  // 移动到前一个节点
        }

        b = 0; // 清空b,为除法做准备

        p = number->next; // 开始大数除法时从number链表的前部开始

        while (p != number) //若计算出的数字为自然数,则直接放入data域;若等于0,或为小数,则要计算余数并给b。
        {   //除法运算
            a = p->data + b * 10; // 计算当前位加上之前的余数乘以10
            p->data = a / (2 * i + 1); // 计算当前位的商,并放入当前节点的data域
            b = a % (2 * i + 1); // 计算余数
            p = p->next; // 移动到下一个节点
        }

        b = 0; // 清零b

        p = number->pre; // 开始大数加法时从number链表的尾部开始
        q = sum->pre;  // 从sum链表的尾部开始

        while (p != number) //大于10进位,并储存个位数,进位数字赋给b。
        {   // 加法计算
            a = p->data + q->data + b; // 计算当前位的和加上之前的进位
            q->data = a % 10; // 取个位数放入sum链表的当前节点的data域
            b = a / 10; // 计算进位
            p = p->pre; // 移动到number链表的前一个节点
            q = q->pre; // 移动到sum链表的前一个节点
        }
    }

    printf("3."); // 输出π的前缀"3."

    x = sum->next->next; // 从sum链表的第三个节点开始输出,即输出π的小数部分

    FILE *fp = fopen("E:\\C语言的软件\\数据结构与算法\\1\\PI的存储.txt","w+");
    fprintf(fp,"3.");
    for (int i = 0; i < n; i++) // 输出n位小数
    {
        fprintf(fp,"%d",x->data); //存储PI
        printf("%d", x->data); // 输出当前节点的data域的值
        x = x->next; // 移动到下一个节点
    }
    fclose(fp);
    return 0;
}

图1-1 实现PI的高精度的计算

图1-2 高精度PI的存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/726825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02 Pytorch_NLP

1. N-gram n决定关联信息 2. TF____IDF TF&#xff1a;词频 IDF&#xff1a;逆向序列 假如&#xff1a;TF * IDF 就是当前的文件&#xff0c;那么乘积反而更大&#xff01; 因为它只出现在 特定的文章中&#xff01; TF-IDF 简介 TF-IDF&#xff08;Term Frequency-Inverse…

Ansys Mechanical|学习方法

Ansys Mechanical是Ansys的旗舰产品之一&#xff0c;涉及的学科体系全面丰富&#xff0c;包括的力学分支主要有理论力学&#xff0c;振动理论&#xff0c;连续介质力学&#xff0c;固态力学&#xff0c;物理力学&#xff0c;爆炸力学及应用力学等。 在自媒体及数字经济飞速发展…

【CSS in Depth2精译】1.2 继承~1.3 特殊值

文章目录 1.2 继承1.3 特殊值1.3.1 inherit 关键字1.3.2 initial 关键字1.3.3 unset 关键字1.3.4 revert 关键字 1.2 继承 除了层叠&#xff0c;还有一种给元素设置样式的方式&#xff1a;继承。经常有人把层叠与继承的概念弄混淆。它们虽然有关联&#xff0c;但也应该分辨清楚…

react实现窗口悬浮框,可拖拽、折叠、滚动

1、效果如下 2、如下两个文件不需要修改 drag.js import React from "react"; import PropTypes from "prop-types";export default class DragM extends React.Component {static propTypes {children: PropTypes.element.isRequired};static defaultP…

什么是片上端接校准(On Die Termination Calibration)技术?

On Die Termination Calibration 随着对于数字系统性能要求的不断提高&#xff0c;对信号完整性的要求也越来越高&#xff0c;从而能够在更高的速率下可靠运行。信号线端接是信号完整性管理中的有用元件&#xff0c;可以在memory外部或memory内部使用。在DRAM器件中加入电阻端接…

ChatmoneyAI如狂风般席卷广告创意舞台,轻松闯荡财富之海!

本文由 ChatMoney团队出品 引言 在广告创意行业&#xff0c;创新和高效是赢得市场的关键。而我今天要分享的就是如何利用ChatmoneyAI这款强大的人工智能工具&#xff0c;打破创新难题&#xff0c;赚取丰厚收益。 让我告诉你一个小秘密&#xff0c;有客户曾在一个月内&#xf…

React Native性能优化红宝书

一、React Native介绍 React Native 是Facebook在React.js Conf2015 推出的开源框架&#xff0c;使用React和应用平台的原生功能来构建 Android 和 iOS 应用。通过 React Native&#xff0c;可以使用 JavaScript 来访问移动平台的 API&#xff0c;使用 React 组件来描述 UI 的…

MATLAB直方图有关的函数

histogram Histogram plot画直方图 histcounts 直方图 bin 计数 histcounts是histogram的主要计算函数。 discretize 将数据划分为 bin 或类别 histogram2 画二元直方图 histcounts2 二元直方图 bin 计数 hist和histc过时了。替换不建议使用的 hist 和 histc 实例 hist → \r…

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会&#xff0c;爱慕向来短暂&#xff0c;失去才是唯一出路 摘录 《把你写进诗歌里&#xff08;2020年度中国优秀诗歌&#xff09;》&#xff0c;作者上官文露。并不惊艳&#xff0c;中英文双语对照的一本诗集&…

压缩pdf文件大小在线,在线免费压缩pdf

在现在办公中&#xff0c;PDF文档已经成为我们日常工作中不可或缺的一部分。然而&#xff0c;随着文档内容的不断丰富&#xff0c;PDF文件的大小也逐渐增大&#xff0c;这不仅占用了大量的存储空间&#xff0c;而且在传输和共享时也显得尤为不便。所以有时候我们需要把pdf压缩小…

connect-caption-and-trace——用于共同建模图像、文本和人类凝视轨迹预测

介绍 论文地址&#xff1a;https://arxiv.org/abs/2105.05964 源码地址&#xff1a;https://github.com/facebookresearch/connect-caption-and-trace 在过去&#xff0c;计算机视觉和自然语言处理领域的模型和算法的发展只有偶尔的重叠&#xff0c;但近年来&#xff0c;这两…

AI音乐大模型:是创意的助力还是产业的挑战?

近期音乐界迎来了一场前所未有的革命。随着多家科技公司纷纷推出音乐大模型&#xff0c;素人生产音乐的门槛被前所未有地拉低&#xff0c;一个崭新的“全民音乐时代”似乎已近在眼前。然而&#xff0c;在这场技术革新的浪潮中&#xff0c;关于AI产品版权归属、创意产业如何在AI…

服务器无法远程桌面连接,解决服务器进行无法远程桌面连接方法有哪些

当服务器无法建立远程桌面连接时&#xff0c;通常涉及多个层面的排查和修复。下面将详细列举一些专业的解决方法&#xff0c;以应对服务器远程桌面连接问题。 一、基础排查与验证 1. 确认网络连通性&#xff1a; - 使用ping命令检查客户端与服务器之间的网络连通性。 - …

数据结构之B数

目录 1.概述 2.特点 3.诞生 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.C语言中的B树实现例子 7.总结 1.概述 B树&#xff08;B-tree&#xff09;是一种自平衡的树数据结构&#xff0c;广泛应用于数据库和文件系统中&#xff0c;以便高效地进行顺序读取、写入以及查找…

Cytoscape之操作界面介绍

Cytoscape 简介 Cytoscape是一个专注于开源网络可视化和分析的软件。软件的核心部分提供了网络显示、布局、查询等方面的基本功能。软件的核心可以通过插件架构进行扩展&#xff0c;这样就能快速地开发出新的功能。 Cytoscape 源自系统生物学&#xff0c;用于将生物分子交互网…

win10成功安装stable-diffusion-webui

目录 1.python下载安装 2.git下载安装 3.stable-diffusion-webui下载 4.安装s-d-webui的依赖包&#xff08;用国内镜像提速&#xff09; 5.git下载的stable-diffusion-webui&#xff0c;依赖包提示已安装&#xff0c;但运行webui-user.bat后&#xff0c;又开始下载 6.修改…

2024最新AI大模型-LLm八股合集(八)-Transformer模型

更多2024最新AI大模型-LLm八股合集可以拉到文末&#xff01;&#xff01;&#xff01; MHA & MQA & MGA &#xff08;1&#xff09;MHA 从多头注意力的结构图中&#xff0c;貌似这个所谓的多个头就是指多组线性变换层&#xff0c;其实并不是&#xff0c;只有使用了一…

ARM Linux 设备树详细介绍(1)

1. ARM&Device&Tree 起源 Linus Torvalds 在 2011 年 3 月 17 日的 ARM Linux 邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”&#xff0c;引发 ARM Linux 社区的地震&#xff0c;随后 ARM 社区进行了一系列 的重大修正。 在过去的 ARM Linux 中&…

Pointnet++改进即插即用系列:全网首发FastKAN|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入FastKAN,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…

360vr党建线上主题展立体化呈现企业的文化理念和品牌形象

在现代科技的引领下&#xff0c;艺术与VR虚拟现实技术相融合必将成为趋势&#xff0c;深圳VR公司华锐视点荣幸地推出VR艺术品虚拟展厅&#xff0c;为您带来前所未有的艺术观赏体验。体验者足不出户即可置身于一个充满创意与灵感的虚拟艺术空间。 我们深入了解每一位客户的需求与…
最新文章