/*
长 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. PAT (Advanced Level) 1084. Broken Keyboard (20)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  2. [iOS Animation]-CALayer 图层性能

    图层性能 要更快性能,也要做对正确的事情. ——Stephen R. Covey 在第14章『图像IO』讨论如何高效地载入和显示图像,通过视图来避免可能引起动画帧率下降的性能问题.在最后一章,我们将着 ...

  3. div无法跟随内容的增加而拉伸

    有时将 div 的 height 设置为 auto 后,仍然无法让 div 自动拉伸,发现是 display:block 的原因,将其设置为 inline-block 即可.

  4. ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏

    IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...

  5. 【转】HashMap实现原理分析

    1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...

  6. 【NOIP2015】反思+题解

    D1T1> 神奇的幻方 模拟即可. #include <cstdio> #include <cstring> #include <algorithm> #de ...

  7. Android与JNI(三) ---- c++调用java(转载)

    源码下载:JniDemo JNI就是Java Native Interface, 即可以实现Java调用本地库, 也可以实现C/C++调用Java代码, 从而实现了两种语言的互通, 可以让我们更加灵活 ...

  8. css(二) block,inline和inline-block概念和区别

    转: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-leve ...

  9. group by 汇总

    group by 的意思为分组汇总.使用了group by 后,要求Select出的结果字段都是可汇总的,否则就会出错. 比如,有:{学号,姓名,性别,年龄,成绩}字段 这样写:SELECT 学号,姓 ...

  10. border-radius归纳

    一.基本语法 1.1 语法 解释 border-radius:10px 将创建四个大小一样的圆角. border-radius:10px 15px 10px 5px; 四个值分别表示左上角.右上角.右 ...