/*
长 PI 说明:
圆周率后的小数位数是无止境的,如何使用电脑来计算这无止境的小数是一些数学家与程式设计师所感兴趣的,在这边介绍一个公式配合 大
数运算,可以计算指定位数的圆周率。 解法 :
首先介绍J.Marchin的圆周率公式:
PI = [16/5 - 16 / (3*5^3 ) + 16 / (5*5^5) - 16 / (7*5^7) + ] ......] -
[4/239 - 4/(3*239^3) + 4/(5*239^5) - 4/(7*239^7) + ......]
可以将这个公式整理为:
PI = [16/5 - 4/239] - [16/(5^3)- 4/(239^3)]/3+ [16/(5^5)- 4/(239^5)]/5 + ......
也就是说第n项,若为奇数则为正数,为偶数则为负数,而项数表示方式为:
[16/5^(2*n-1)- 4/239^(2*n-1)] / (2*n-1)
如果我们要计算圆周率至10的负L次方,由于[16/5^(2*n-1) - 4/239^(2*n-1)]中16/5^(2*n-1) 比4/239^(2*n-1) 来的大,具有决定性,所以表示
至少必须计算至第n项:
[16/5^(2*n-1)] / (2*n-1) = 10^(-L)
将上面的等式取log并经过化简,我们可以求得:
n = L / (2log5) = L / 1.39794
所以若要求精确度至小数后L位数,则只要求至公式的第n项,其中n等于:
n = [L/1.39794] + 1
在上式中[]为高斯符号,也就是取至整数(不大于L/1.39794 的整数);为了计简方便,可以在 程式中使用下面这个公式来计简第n项:
[W(n) -1/5^2 - V(n) - 1 / (239^2)] / (2*n-1)
这个公式的演算法配合大数运算函式的演算法为:
div(w, , 25, w);
div(v, , 239, v);
div(v, , 239, v);
sub(w, , v, q);
div(q, , 2*k-1, q)
至于大数运算的演算法,请参考之前的文章,必须注意的是在输出时,由于是输出阵列中的整数值,如果阵列中整数位数不满四位,则必须补
上0,在C语言中只要 使用格式指定字%04d ,使得不足位数部份自动补上0再输出,至于Java的部份,使用 NumberFormat来作格式化 */ #include <stdio.h> #define L 1000 //L为位数,N是array的长度
#define N L/4 + 1 void add(int* , int* , int* );
void sub(int* , int* , int* );
void div(int* , int , int* ); int main(void)
{
int s[N+] = {};
int w[N+] = {};
int v[N+] = {};
int q[N+] = {};
int n = (int)(L/1.39793 + );
int k; w[] = *;
v[] = *; for(k = ; k <= n; k++)
{
div(w, , w);
div(v, , v);
div(v, , v);
sub(w, v, q);
div(q, * k - , q); if(k % )
{
add(s, q, s);
}
else
{
sub(s, q, s);
}
}
printf("%d", s[]);
for(k = ; k < N; k++)
{
printf("%04d", s[k]);
}
printf("\n"); return ;
} void add(int* a, int* b, int* c)
{
int i, carry = ; for(i = N + ; i >= ; i--)
{
c[i] = a[i] + b[i] + carry;
if(c[i] < )
{
carry = ;
}
else
{
c[i] = c[i] - ;
carry = ;
}
}
} void sub(int* a, int* b, int*c)
{
int i, borrow = ;
for(i = N + ; i >= ; i--)
{
c[i] = a[i] - b[i] -borrow;
if(c[i] >= )
{
borrow = ;
}
else
{
c[i] = c[i] + ;
borrow = ;
}
}
} void div(int* a, int b, int* c)
{
int i, tmp, remain = ;
for(i = ; i <= N + ; i++)
{
tmp = a[i] + remain;
c[i] = tmp / b;
remain = (tmp % b) * ;
}
}

结果如下:

【长 PI】的更多相关文章

  1. node操作MongoDB数据库之插入

    在上一篇中我们介绍了MongoDB的安装与配置,接下来的我们来看看在node中怎样操作MongoDB数据库. 在操作数据库之前,首先应该像关系型数据库一样建个数据库把... 启动数据库 利用命令提示符 ...

  2. c经典算法

    1. 河内之塔 说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时 北越的首都,即现在的胡志明市:1883年法国数学家 Ed ...

  3. Java经典算法大全

    1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6. ...

  4. redis 间断性耗时长问题解决

    我发现开发项目用的redis 隔一两分钟就出现 耗时问题,长达五秒.一开始以为是 redis 服务器不稳定,但运维测试发现redis稳定的,在高并发下最大耗时也就只有100毫秒左右,怎么也不可能达到5 ...

  5. POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次

    Milk Patterns   Description Farmer John has noticed that the quality of milk given by his cows varie ...

  6. POJ 3294 Life Forms 后缀数组+二分 求至少k个字符串中包含的最长子串

    Life Forms   Description You may have wondered why most extraterrestrial life forms resemble humans, ...

  7. poj2774 后缀数组2个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 26601   Accepted: 10 ...

  8. hdu 5100 n*n棋盘放k*1长方条最多覆盖面积

    http://acm.hdu.edu.cn/showproblem.php?pid=5100 给一个n*n的棋盘,问用k*1的长方条最多能覆盖多大的面积(k个单位都必须完全覆盖上去) 首先,若n< ...

  9. hdu 5773 The All-purpose Zero 最长上升子序列+树状数组

    题目链接:hdu 5773 The All-purpose Zero 官方题解:0可以转化成任意整数,包括负数,显然求LIS时尽量把0都放进去必定是正确的. 因此我们可以把0拿出来,对剩下的做O(nl ...

随机推荐

  1. Android学习笔记之Intent(1)

    1.Intent指定启动目标组件 2.Intentfilter描述基本组件所在地址 3.其他包引入资源文件时记得引入R所在的包 package com.jikexueyuan.intent; impo ...

  2. oracle监听无法启动

    昨天再监听里新加了个地址,重启电脑后监听无法启动,删除新加地址就好了 # listener.ora Network Configuration File: d:\oracle\product\10.2 ...

  3. 在MAC下配置MySQL 5.7 数据库的编码问题

    1.MySQL 5.7 for MAC 默认没有my.cnf文件 ,首先 新建my.cnf文件: 2.在my.cnf文件追加 [mysqld] character-set-server=utf8mb4 ...

  4. Linux下gcc编译生成动态链接库*.so文件并调用它 是转载的

    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...

  5. CentOS 5.8 x64 安装TomCat

    简单记录一下...虽然安装很简单... 首先下载配置安装 jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-do ...

  6. [iOS Animation]-CALayer 定时器动画

    定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速 ...

  7. 十大滤波算法程序大全(Arduino精编无错版)(转)

    源:十大滤波算法程序大全(Arduino精编无错版) 转载请注明出处:极客工坊  http://www.geek-workshop.com/thread-7694-1-1.html

  8. iOS自定义字体及类目

    1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...

  9. UWP_小说在线阅读器:功能要求与技术要求

    学了WP开发也有一年了,也没做过什么软件的.17年进发UWP,锻炼自己一下.做一个开源的小说阅读器吧. 既然开发一个软件.所以要设计一下吧. 功能要求: 可能要用到的技术,这个吗,这就是遇到问题在解决 ...

  10. IOS 实现TXT文本自动识别编码的方法

    from :http://kyoworkios.blog.51cto.com/878347/1344013 TXT识别编码是个复杂的问题.幸好有c/c++的一个库能识别. 库的叫uchardet,可以 ...