高精度计算PI值实验_阳城轩哥灬的博客-程序员秘密_如何精确的计算pi小数点后5000位

技术标签: 链表  数据结构  

前言:此文章用于高精度计算pi值,详细介绍了函数代码实现,可能比较繁琐,只需要代码的可以 翻到文末完整代码处,另外计算pi值的函数中会用到较多高数方面知识,如果不懂就得劳烦大家自行查阅相关资料。

一、需求分析

1、输入的形式和输入值的范围:输入一个正整数n,表示小数点后精确的位数,小于500

2、输出的形式:输出PI值,精确到小数点后n位,最后还要输出一个回车

3、程序所能达到的功能:高精度计算PI的值,并将其按位储存在一个双链表中

4、测试数据:

二、概要设计

为了实现上述操作,应以双向链表为存储结构。

1.基本操作:

void Create() 创建双链表,初始化值全部为0;

void he()    若链表存在,实现将两个链表对应项相加并储存到第一个链表中(注意进位)

void cheng()  若链表存在,实现将链表每位乘以个x并保存回去并注意进位

void chu()    若链表存在,实现将链表每一位对x的余数乘10加到本位

DLinkList pi()  实现计算高精度计算pi值

void show() 实现将链表的前n位输出,并按要求在最后输出一个换行符

2.本程序包含三个模块:

(1)主程序模块;

(2)构造链表并初始化模块;

(3)计算pi并输出模块;

(4)模块调用图:

主程序模块

构造链表并初始化模块

计算pi并输出模块

{

调用了和函数,积函数,商函数(具体作用见1)

}

最后调用show函数进行输出模块

 (三) 详细设计

1.元素类型,结点类型和指针类型:

typedef struct DNode

{

    int data;

    struct DNode* next;

    struct DNode* pre;

}DNode, * DLinkList;      

2.每个模块的分析:

(1)主程序模块:

int main()

{

    int n;

    scanf_s("%d", &n);

    DLinkList l, t;

    Create(&l, 999);                       

    Create(&t, 999);

    l=pi(l, t);

    printf("3.");

    show(l, n);                            

    return 0;

}

(2)构造链表并初始化模块;

void Create(DLinkList* L, int n)

{

    DLinkList s;

    *L = (DLinkList)malloc(sizeof(DNode));          

    (*L)->pre = (*L)->next = NULL;                    

    for (; n > 0; n--) {                                

        s = (DLinkList)malloc(sizeof(DNode));       

        s->data = 0;                                

        s->next = (*L)->next;

        if ((*L)->next != NULL) {                     

            (*L)->next->pre = s;

        }

        (*L)->next = s;                            

        s->pre = *L;

    }

}                      //创建初值为0的双链表

(3)计算pi并输出模块

DLinkList pi(DLinkList l, DLinkList t ) {

    t->next->data = 5;                           

    he(l, t);

    int  i, a, b;

    for (i = 1; i < 5000; i++) {                          

        a = (2 * i - 1) * (2 * i - 1);

        b = 8 * i * (2 * i + 1);

        cheng(t, a);

        chu(t, b);

        he(l, t);

    }             //泰勒展开,中间用到了递归(重要的pi值计算算法)

    cheng(l, 6);

    return l;

}

3.计算pi中用到的函数

  a.和函数 

 void he(DLinkList l, DLinkList t)

{

    DLinkList p, q;

    int a = 0;

    p = l;

    q = t;

    while (p->next != NULL) {                         

        p->next->data = p->next->data + q->next->data;

        p = p->next;

        q = q->next;

    }

    while (p->pre != NULL) {                         

        p->data += a;

        a = p->data / 10;

        p->data %= 10;

        p = p->pre;

    }

}                 //将两个链表的元素对应项加并保存到第一个链表里,还要注意进位

   b.积函数

   void cheng(DLinkList t, int x)

{

    DLinkList p;

    int a = 0;

    p = t;

    while (p->next != NULL) {                         

        p->next->data *= x;

        p = p->next;

    }

    while (p->pre != NULL) {                         

        p->data += a;

        a = p->data / 10;

        p->data %= 10;

        p = p->pre;

    }

}                         //将链表里每个元素乘以x并保存回去,注意进位

     c.商函数

void chu(DLinkList t, int x)

{

    DLinkList p;

    int a = 0;

    p = t->next;

    while (p != NULL) {

        p->data += a * 10;                          

        a = p->data % x;

        p->data /= x;

        p = p->next;

    }

}                       //将链表每一位对x的余数乘10加到本位

(4)函数调用关系图

main()

{

void Create()

DLinkList pi()

{

void he()

void cheng()

void chu()

}

void show()

}

3.完整的程序:

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

typedef struct DNode
{
    int data;
    struct DNode* next;
    struct DNode* pre;
}DNode, * DLinkList;

void Create(DLinkList* L, int n)
{
    DLinkList s;
    *L = (DLinkList)malloc(sizeof(DNode));          
    (*L)->pre = (*L)->next = NULL;                    
    for (; n > 0; n--) {                                
        s = (DLinkList)malloc(sizeof(DNode));       
        s->data = 0;                                
        s->next = (*L)->next;
        if ((*L)->next != NULL) {                     
            (*L)->next->pre = s;
        }
        (*L)->next = s;                            
        s->pre = *L;
    }
}

void show(DLinkList L, int n)
{
    DNode* p = L;
    int i = 0;
    while (p->next != NULL && i < n) {
        p = p->next;
        printf("%d", p->data);
        i++;
    }
    printf("\n");
}

void he(DLinkList l, DLinkList t)
{
    DLinkList p, q;
    int a = 0;
    p = l;
    q = t;
    while (p->next != NULL) {                         
        p->next->data = p->next->data + q->next->data;
        p = p->next;
        q = q->next;
    }
    while (p->pre != NULL) {                         
        p->data += a;
        a = p->data / 10;
        p->data %= 10;
        p = p->pre;
    }
}

void cheng(DLinkList t, int x)
{
    DLinkList p;
    int a = 0;
    p = t;
    while (p->next != NULL) {                         
        p->next->data *= x;
        p = p->next;
    }
    while (p->pre != NULL) {                         
        p->data += a;
        a = p->data / 10;
        p->data %= 10;
        p = p->pre;
    }
}

void chu(DLinkList t, int x)
{
    DLinkList p;
    int a = 0;
    p = t->next;
    while (p != NULL) {
        p->data += a * 10;                          
        a = p->data % x;
        p->data /= x;
        p = p->next;
    }
}


DLinkList pi(DLinkList l, DLinkList t ) {
    t->next->data = 5;                           
    he(l, t);
    int  i, a, b;
    for (i = 1; i < 5000; i++) {                          
        a = (2 * i - 1) * (2 * i - 1);
        b = 8 * i * (2 * i + 1);
        cheng(t, a);
        chu(t, b);
        he(l, t);
    }
    cheng(l, 6);
    return l;
}

int main()
{
    int n;
    scanf_s("%d", &n);
    DLinkList l, t;
    Create(&l, 999);                       
    Create(&t, 999);
    l=pi(l, t);
    printf("3.");
    show(l, n);                            
    return 0;
}

(四) 程序使用说明及测试结果

1.程序使用说明

(1)本程序的运行环境为VC6.0。

(2)输入想要输出的pi后保留位数

2.运行界面

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46184703/article/details/120537321

智能推荐

【转】SMARTFORMS不弹出打印,预览的窗口,直接预览_调用smartforms时不显示打印预览_SpanserWang的博客-程序员秘密

转自:http://blog.csdn.net/sclw0488/archive/2008/04/09/2270607.aspx  DATA: ctrl_param TYPE ssfctrlop,   out_option TYPE ssfcompop,   fm_name TYPE rs38l_fnam.   ctrl_param-preview = X.   out_option-

14-EMM Procedure 4. Service Requet_dolphin98629的博客-程序员秘密

原文链接:http://www.netmanias.com/en/?m=view&id=techdocs&no=6134I. Introduction这篇文档描述EMM case-4:service request过程。这个过程是当有新流量时,在idle状态不活动的UE想激活来处理流量时执行的。新用户流量可以是从UE开始的上行流量,也可以是从网络到UE的下行流量。UE的E-

冲压模具是冲压生产必不可少的工艺装备_Trouvaille_a的博客-程序员秘密

模具(俗称冷冲模)。冲压–是在室温下,利用安装在压力机上的模具对材料施加压力,使其产生分离或塑性变形,从而获得所需零件的一种压力加工方法。冲压模具是冲压生产必不可少的工艺装备,是技术密集型产品。冲压件的质量、生产效率以及生产成本等,与模具设计和制造有直接关系。二、分类冲压模具的形式很多,冲模也依工作性质,模具构造,模具材料三方面来分类。一般可按以下几个主要特征分类:1.根据工艺性质分类a.冲裁模 沿封闭或敞开的轮廓线使材料产生分离的模具。如落料模、冲孔模、切断模、切口模、切边模、剖切模等。b.

oracle 列转行函数 Listagg() 博客_几幅呙崴的博客-程序员秘密

oracle 列转行函数 Listagg()博客分类: Oracle SQL 这是一个Oracle的列转行函数:LISTAGG() 先看示例代码:Sql代码  with temp as(    select 'China' nation ,'Guangzhou' city from dual union all

Flume日志采集系统——初体验(Logstash对比版)_xing halo的博客-程序员秘密

Flume日志采集系统——初体验(Logstash对比版) 这两天看了一下Flume的开发文档,并且体验了下Flume的使用。本文就从如下的几个方面讲述下我的使用心得:初体验——与Logstash的对比安装部署启动教程参数与实例分析Flume初体验Flume的配置是真繁琐,source,channel,sink的关系在配置文件...

C++中智能指针的设计和使用_shikelang_pp的博客-程序员秘密

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235     智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对

随便推点

node遍历文件夹并读取文件内容_node读取文件夹所有文件排序_张兴华(MarsXH.Chang)的博客-程序员秘密

&amp;lt;input type=&quot;file&quot; webkitdirectory directory multiple&amp;gt;var fs = require('fs');var path = require('path');//解析需要遍历的文件夹var filePath = path.resolve('./dist');//调用文件遍历方法fileDisplay(filePath);/...

JAVA 时间"dd/MMM/yyyy:HH:mm:ss Z", Locale.US_weixin_30781107的博客-程序员秘密

工作遇到时间格式转换问题,就是在日志分析时,需要将格式“15/Oct/2009:14:00:00 +0800”转为格式“2009-10-15 14:00:00”,找了好久没有找到合适的,终于在友人的帮助下解决了:String viewtime = "15/Oct/2009:14:00:00 +0800";Date time = new Date();/...

三层HashMap的嵌套_三层map嵌套_Unknown To Known的博客-程序员秘密

package cn.itcast_04;import java.util.ArrayList;import java.util.HashMap;import java.util.Set;/* * 三层HashMap的嵌套 * * 动漫小说 * dm 动漫区 * rm 日漫: * 漩涡鸣人 27 * 宇智波佐助 30 *

jq插件之tab选项卡切换_tab切换插件_caimaomaocai的博客-程序员秘密

沉迷于OOP编程不可自拔。。本博是关于tab选项卡切换的插件HTML代码部分&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html lang=&quot;en&quot;&amp;gt;&amp;lt;head&amp;gt; &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt; &amp;lt;title&amp;gt;tab选项卡切换&amp;lt;/title&amp;gt; &amp;lt;style&amp;gt;

Fast Convergence of DETR with Spatially Modulated Co-Attention_Amusi(CVer)的博客-程序员秘密

为了加速DETR收敛,本文提出了一种简单而有效的方案来改进DETR框架,即空间调制协同注意(SMCA)机制。即插即用,让DETR涨点明显。性能优于可变形DETR、DETR等网络。注1:文末附【Transformer】和【目标检测】交流群注2:整理不易,点赞的人暴富,论文多多!SMCAFast Convergence of DETR with Spatially Modulated Co-Attention作者单位:港中文(李鸿升团队), 商汤(代季峰), 北大论文:https://arxiv

mysql数据同步_MySQL数据库之主从同步_GOLFING路上的博客-程序员秘密

一、概述:MYSQL主从同步架构是目前使用最多的数据库架构之一,主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。二、拓扑图说明:如上图所示,192.168.4.10(主机名为"10.mysql")作为MySQL主数据库,192.168.4.20(主机名为"20.mysql")作为MySQL从数据...

推荐文章

热门文章

相关标签