前言:此文章用于高精度计算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.运行界面
转自: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-
原文链接:http://www.netmanias.com/en/?m=view&id=techdocs&no=6134I. Introduction这篇文档描述EMM case-4:service request过程。这个过程是当有新流量时,在idle状态不活动的UE想激活来处理流量时执行的。新用户流量可以是从UE开始的上行流量,也可以是从网络到UE的下行流量。UE的E-
模具(俗称冷冲模)。冲压–是在室温下,利用安装在压力机上的模具对材料施加压力,使其产生分离或塑性变形,从而获得所需零件的一种压力加工方法。冲压模具是冲压生产必不可少的工艺装备,是技术密集型产品。冲压件的质量、生产效率以及生产成本等,与模具设计和制造有直接关系。二、分类冲压模具的形式很多,冲模也依工作性质,模具构造,模具材料三方面来分类。一般可按以下几个主要特征分类:1.根据工艺性质分类a.冲裁模 沿封闭或敞开的轮廓线使材料产生分离的模具。如落料模、冲孔模、切断模、切口模、切边模、剖切模等。b.
oracle 列转行函数 Listagg()博客分类: Oracle SQL 这是一个Oracle的列转行函数:LISTAGG() 先看示例代码:Sql代码 with temp as( select 'China' nation ,'Guangzhou' city from dual union all
Flume日志采集系统——初体验(Logstash对比版) 这两天看了一下Flume的开发文档,并且体验了下Flume的使用。本文就从如下的几个方面讲述下我的使用心得:初体验——与Logstash的对比安装部署启动教程参数与实例分析Flume初体验Flume的配置是真繁琐,source,channel,sink的关系在配置文件...
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对
&lt;input type="file" webkitdirectory directory multiple&gt;var fs = require('fs');var path = require('path');//解析需要遍历的文件夹var filePath = path.resolve('./dist');//调用文件遍历方法fileDisplay(filePath);/...
工作遇到时间格式转换问题,就是在日志分析时,需要将格式“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();/...
package cn.itcast_04;import java.util.ArrayList;import java.util.HashMap;import java.util.Set;/* * 三层HashMap的嵌套 * * 动漫小说 * dm 动漫区 * rm 日漫: * 漩涡鸣人 27 * 宇智波佐助 30 *
沉迷于OOP编程不可自拔。。本博是关于tab选项卡切换的插件HTML代码部分&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;tab选项卡切换&lt;/title&gt; &lt;style&gt;
为了加速DETR收敛,本文提出了一种简单而有效的方案来改进DETR框架,即空间调制协同注意(SMCA)机制。即插即用,让DETR涨点明显。性能优于可变形DETR、DETR等网络。注1:文末附【Transformer】和【目标检测】交流群注2:整理不易,点赞的人暴富,论文多多!SMCAFast Convergence of DETR with Spatially Modulated Co-Attention作者单位:港中文(李鸿升团队), 商汤(代季峰), 北大论文:https://arxiv
一、概述:MYSQL主从同步架构是目前使用最多的数据库架构之一,主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。二、拓扑图说明:如上图所示,192.168.4.10(主机名为"10.mysql")作为MySQL主数据库,192.168.4.20(主机名为"20.mysql")作为MySQL从数据...