题目要求

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

思路分析

  • 反三角函数幂级展开式
  • 由公式可以看出,只要计算出来每一个R(n)的值再相加取二倍就可以得到Π的值。
  • 经过推算,要是令R(1)=2,只需要将每个R(n),相加即可。
  • 因为,要求精度最高达到小数点后500位,所以我们不能使用已有的数据类型进行计算。这里我们使用双链表构造一个满足我们需求的足够长的数。
  • 对双链表组成的数用模拟手算的方法进行大数运算即可。
  • 根据题目具体情况,我们链表的第一个节点存储的是整数部分。

完整程序

#include <stdio.h>
#include <stdlib.h>
typedef struct node{int date;struct node* pre;struct node* next;
}node,*pnode;
void insert(pnode list,int date){//尾插法向链表中添加元素 pnode p = list;if(p==NULL){return; }else{while(p->next){p = p -> next;}pnode pnew=(pnode)malloc(sizeof(node));pnew -> date = date;p -> next = pnew;pnew-> pre =p;pnew -> next = NULL;  }
}
void tranverselist(pnode list,int n){//遍历链表并输出指定位数的小数 pnode p = list; p=p->next;printf("%d.",p->date);int i;p=p->next;for(i=0;i<n;i++){printf("%d",p->date);if(p->next){p=p->next;}}printf("\n");
}
int main()
{pnode num;//num为每次相加的 R(n); pnode sum;//sum最终的值约等于 Π;num=(pnode)malloc(sizeof(node));sum=(pnode)malloc(sizeof(node));num -> pre = NULL;sum -> pre = NULL;num -> next = NULL;sum -> next = NULL; //n为题目要求输出的的Π的小数位数; int n;scanf("%d",&n); //给链表补够600位来进行计算,因为我的精度要达到500 int i; for(i=0;i<600;i++){insert(num,0);insert(sum,0);}//p1,p2为指向两个链表的指针 pnode p1 = num -> next;pnode p2 = sum -> next;//使两个链表除头节点外第一个节点的数据为2,计算直接从R2开始计算,简化了计算 p1->date=2;p2->date=2;//指向num,和sum的尾节点while(p1->next){p1=p1->next;} pnode numtail = p1;while(p2->next){p2=p2->next;}pnode sumtail = p2;//开始运算; int temp = 0;//计算过程中产生的临时数据 int ret = 0; //计算过程中产生的借位or进位int t;//计算时有规律出现的除数 (2n+1)for(i=1,t=3;i<10000;i++,t=t+2){//根据数学的知识,算的次数越多越精确 //i同时承担计数和做乘数的任务 //先计算乘法(即公式中R(n)*n) pnode p3 = numtail;ret=0;while(p3) { temp = p3 -> date * i + ret;p3 -> date = temp%10;ret = temp/10;p3 = p3 -> pre;}   ret = 0;p3 = num -> next;//计算除法 (即公式中的R(n)*n/(2*n+1))while(p3){temp = p3 -> date + ret*10;ret = temp % t;p3 -> date = temp/t;p3=p3->next; }  ret = 0;pnode  p4 = sumtail;p3 = numtail;//将得到的R(n)的值加入到结果中 while(p3&&p4){temp = p3 -> date + p4->date +ret ;ret = temp/10;p4->date=temp%10;p3=p3->pre;p4=p4->pre; } }  tranverselist(sum,n);  return 0;
}

运行实例

高精度计算Π的值(C语言)相关推荐

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

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

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

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

  3. ostream作为函数返回值_GO语言基础函数

    GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...

  4. c语言 return两个值,c语言return能不能有2个以上返回值

    c语言return能不能有2个以上返回值 c语言return能不能有2个返回值 比如说return(a,b) 更新时间:2019-05-18 06:19 最满意答案 不是,要想返回2个以上返回值,建议 ...

  5. c语言自定义函数多个返回值,C语言函数返回值

    C语言函数返回值教程 如果,我们希望函数不返回任何值,那么我们需要显式的指明其返回类型为 C语言函数不返回值 语法 void funcName(paramType1 param1, paramType ...

  6. python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...

    导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...

  7. c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配

    指针为C语言编程提供了强大的支持--如果你能正确而灵活地利用指针,你就可以直接切入问题的核心,或者将程序分割成一个个片断.一个很好地利用了指针的程序会非常高效.简洁和精致. 利用指针你可以将数据写入内 ...

  8. r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解

    一. 简介 cat.print函数都是输出函数 > cat("hello world") hello world >> print("hello wor ...

  9. 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)C语言程序设计在线作业-1辅导资料.docx-资源下载在线文库www.lddoc.cn...

    南开19春学期(1503.1509.1603.1609.1703)<C语言程序设计>在线作业-1辅导资料.docx 南开19春学期(1503.1509.1603.1609.1703)C语言 ...

最新文章

  1. android studio val,Kotlin学习笔记之const val与val
  2. 难道他们说的都是真的?
  3. OVS openflow(二十四)
  4. LeetCode 58. 最后一个单词的长度
  5. 为什么在Python中使用string.join(list)而不是list.join(string)?
  6. 【例题+习题】【数值计算方法复习】【湘潭大学】(四)
  7. python etree xpath_【Python】爬虫之使用etree进行xpath元素定位
  8. 编程大讲坛 坛坛是佳酿--编程大讲坛:C语言核心开发技术从入门到精通
  9. Baxter实战 (五)安装openNI2,NiTE-2并实现kinect 2实现动作跟随
  10. linux搭建禅道_linux下搭建禅道项目管理系统
  11. Jfinal的七牛云存储插件:qiniuPlugin for jfinal.
  12. python 基础 7.1 datetime 获得时间
  13. CentOS 6.5安装chromium
  14. VaR、CoVaR、delta CoVaR计算方法综述 案例与代码
  15. DeepZoom交互方式查看高分辨率图像技术知识点
  16. Window环境下 Jenkins Master/Slaver模式 + Svn 部署
  17. python处理netcdf_Python处理netCDF文件
  18. 公众号h5拼团购买业务梳理
  19. 使用Qt做一个简单计算器
  20. 微信或企业微信实现扫码登录的三种方式

热门文章

  1. apm性能监控系统,字节跳动Android三面凉凉,再不刷题就晚了!
  2. 正则验证加js大全,真的很给力!!!很全啊有木有
  3. centos 6.2 bind dlz mysql 驱动,bind9 dlz mysql 配置 – daemon
  4. icpc 昆明 A.AC
  5. 进制之间快速转换技巧
  6. RK100键盘说明书
  7. LT8911EXB:MIPI CSI/DSI转EDP信号转换芯片-润百信科技提供技术批量支持
  8. windows编程13-WM_CTLCOLORSTATIC
  9. archlinux+i3wm安装与配置
  10. 汽车驱动桥毕业设计【毕业设计(论文) +7张CAD图纸】