/*
长 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. USACO Section 1.1 Your Ride Is Here 解题报告

    题目 问题描述 将字符串转变为数字,字母A对应的值为1,依次对应,字母Z对应的值为26.现在有一个字符串,将其中的每个字符转变为数字之后进行累乘,最终的结果对47求余数. 题目给你两个字符串,其中的字 ...

  2. Nginx日志配置及日志切割

    日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_s ...

  3. python数据类型之 dict(map)

    字典  一.创建字典  方法①:  >>> dict1 = {}  >>> dict2 = {'name': 'earth', 'port': 80}  >& ...

  4. iOS开发——WAVE音频文件解析

    WAV文件也分了好几类,相应的非数据信息存储在文件的头部,下面简单的提一下,然后在最后重点介绍44字节的那种,一般用的都是这个. 1.8KHz采样.16比特量化的线性PCM语音信号的WAVE文件头格式 ...

  5. IOS数据库FMDB增、删、改、查的使用【原创】

    http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...

  6. iOS开发——Localizable.strings

    这篇写的不多,但是绝对诚意满满.不会像别人一样,要不不详细,要不罗里吧嗦一堆. 1.创建Localizable.strings文件 Command+N—>iOS—>Resource—> ...

  7. iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏

    关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...

  8. Codeforces Round 212 Div 2 报告(以前没写完,现在也没心情补了,先就这样吧)

    A. Two Semiknights Meet 题目大意:有一个8x8的棋盘,上面放有两个骑士,骑士以“田字”的方式走.每个方格都被定义为good或者bad,问骑士能否在good的格子中相遇? 由于骑 ...

  9. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  10. BZOJ2720: [Violet 5]列队春游

    2720: [Violet 5]列队春游 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 173  Solved: 125[Submit][Status] ...