这是数据结构第二题的题目,是让我们根据用户的需求来计算派的值
这是题目的详细描述,刚看到这道题的时候,我是真的头大,完全没有思路,于是查找了一些大佬的笔记后才开始编写
这是我在写这些代码是所运用到的数学反三角函数幂次展开式的知识。
下面是正确的代码以及我的一些见解,和需要注意的一些地方。希望能对你有所帮助。如有更加精简的算法,请在评论区留下你的算法!!!谢谢!!!

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>typedef struct DNode {int data;struct DNode* prior, * next;
}DNode, * DoubleList;
void CreatHead(DoubleList* S) {*S = (DNode*)malloc(sizeof(DNode));(*S)->prior = NULL;(*S)->next = NULL;
}
int items(int n) {int i = 1;double sum = 0;int a, b;for (;; i++) {a = 2 * i + 1;b = i;sum = sum + log10(a / b);if (sum > n + 1) {return i;}}
}
void insert(DoubleList a,int b) {//双向链表的插入或者可以说是双向链表的初始化,即将双向链表的数据域中插入值DoubleList p, tmp;int i;p = a;//在这个函数中运用的是尾插的方法来进行插入的操作for (i = 0; i < 600; i++) {tmp = (DNode*)malloc(sizeof(DNode));tmp->data = b;tmp->prior = p;p->next = tmp;p = tmp;}p->next = NULL;
}
void display(DoubleList a, int m) {//这个函数用来输出题目索要我们输出的值DoubleList p;p = a->next;printf("%d.", p->data);p = p->next;for (int i = 1; i <= m; i++) {//此处的m为我们要输出的小数的位数printf("%d", p->data);
//如果下一个结点不为空的话,就继续输出,如果为空,则跳出循环,直接结束if (p->next) {p = p->next;}else {break;}}printf("\n");
}
int main() {int n, k;scanf("%d", &n);//输入所要求输出的位数k = items(n);//算出递推中大概要递推多少次DoubleList num, sum;//num用来计算每一次R(n)的值,sum用来保存计算出来的所有R(n)做和得到的值,即我们最后输出时要用的值CreatHead(&num);CreatHead(&sum);DoubleList p1, p2;//定义两个新的双向链表来指向num和sum两个链表insert(num,0);insert(sum,0);p1 = num->next;p2 = sum->next;//首先将num的数值域赋成R(1)的值,方便后续的递推,并计算出第一个sum的值p1->data = 1;p2->data = 2;DoubleList numtail, sumtail;//两个while循环来将p1和p2指向num和sum的尾结点处while (p1->next) {p1 = p1->next;}numtail = p1;//numtail指向最后一个结点while (p2->next) {p2 = p2->next;}sumtail = p2;//sumtail指向最后一个结点int i;int temp = 0;int ret;int t;for (i = 1, t = 3; i <= k; i++, t = t + 2) {//这里求解派的值运用的公式为反三角函数的幂次展开式p1 = numtail;ret = 0;//用ret来保存每一次的进位或者进行除法之后剩余的数while (p1 != num) {//首先计算R(n)*n,每个链表的结点都只保存了一个10进制的数,所以乘法和除法可以像手算一样一个数一个数相乘在相加temp = p1->data * i + ret;//这里从最后一个数来进行计算,因为乘法是向前在进位ret = temp / 10;temp = temp % 10;//留下这个结点所要保存的数值p1->data = temp;p1 = p1->prior;}ret = 0;//重新置为0,方便后续的运算p1 = num->next;while (p1) {//此处计算[R(n)*n]/(2n+1)中的除法temp = p1->data + ret * 10;//此处的ret要乘上10,因为这里我们是从前往后在进行除法,前一位不能除尽得到的余数到了后一位是要乘上10才能用的ret = temp % t;temp = temp / t;p1->data = temp;p1 = p1->next;//此处因为是从前往后算,所以结束循环的条件是指针指向空指针的时候,也就表示着计算的结束}ret = 0;//加法要从后往前算,因为加法可能会向前进位,所以这里要从后向前算p1 = numtail;p2 = sumtail;//加法的操作与乘法大致相同,只是运用了两个指针,一个用来指向num,一个用来指向储存结果的sum链表while (p1 != num && p2 != sum) {//此处其实可以只写一个,这样写只是为了防止在创建链表的时候,所创建的长度不同,导致程序的崩溃temp = p1->data * 2 + p2->data + ret;ret = temp / 10;temp = temp % 10;p2->data = temp;p1 = p1->prior, p2 = p2->prior;}}display(sum, n);//按照题目输出指定小数位数的派值了即可return 0;
}

这是这个程序运行的结果!希望对你有所帮助!

数据结构实验1.2—高精度计算PI值(西工大)相关推荐

  1. 西工大NOJ数据结构实验——1.2高精度计算PI值

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> typ ...

  2. 高精度计算PI值 C语言 思路,高精度计算pi

    高精度计算PI值 题目描述 ​    使用双向链表作为存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后 500 位),高精度计算PI值.提示:可以利用反三角函 ...

  3. 高精度计算PI值 C语言 思路,高精度计算PI值

    高精度计算PI值 高精度计算PI值 所用公式: #include #include typedef struct list{ int data; struct list *next; struct l ...

  4. 数据结构28——高精度计算PI值

    题目:输入n,输出PI精确到小数点后n位的PI值. #include<stdio.h> #include<stdlib.h>typedef struct node {int d ...

  5. 【算法】高精度计算π(pi)值

  6. 西工大数据结构实验NOJ参考代码和分析合集

    实验1.1 合并有序数组 //001合并有序数组 #include <bits/stdc++.h> #define MAXSIZE 20 //数组的最大长度为20 typedef stru ...

  7. 高精度计算Π的值(C语言)

    题目要求 限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值.可以利用反三角函数幂级展开式来进行计算. 输入5 输 ...

  8. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)

    数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...

  9. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)

    数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...

最新文章

  1. python以下字符串合法的是_以下字符串合法的是().
  2. Adobe公司Flex首席产品经理作序推荐
  3. 如何去掉Silverlight应用程序在浏览器中的滚动条
  4. 一键复制android代码,兼容安卓和ios实现一键复制内容到剪切板
  5. php curl cookie,php中curl获取返回页面的cookie
  6. 在内核中使用线程与skb队列发送数据
  7. lammps教程:以Cu纳米磨削为例详解region命令
  8. 吉大计算机学院奖学金的分配,奖励资助_吉林大学奖学金设置_高考院校库
  9. 重改破解易支付码支付V5.0源码
  10. 清华大学出版社2013年第二期书评征集图书列表
  11. 什么是BI工具,好用的BI工具软件排名
  12. Python学习(七)if语句
  13. 五篇经典好文,值得一看
  14. VSCode折叠所有区域代码快捷键
  15. TlBCO Jaspersoft Studio 软件根据条件设置字体颜色
  16. 一本通1375:骑马修栅栏(fence)
  17. 双音多频 DTMF原理
  18. L2-005 集合相似度(STL)
  19. OpenStack HA集群3-Pacemake Corosync
  20. 搭建量化交易系统接口的步骤是什么?

热门文章

  1. 一条sql语句在mysql中如何执行的
  2. php编码规范(未完待续)
  3. 计算机组成原理-原理篇:指令与运算-12理解电路:从电报机到门电路,我们如何做到“千里传信”?
  4. Linux C/C++编程:setsockopt、getsockopt
  5. ReadEveryDay From LuoJiLab
  6. 微软Windows 10硬件新品发布会
  7. GBase 8a MPP Cluster 产品权限管理:回收权限
  8. 揭秘肖特基二极管与电源流串联的反应
  9. Zookeeper实例创建和会话建立的异步特性
  10. 看《神探夏洛克》经典台词