/*
* -------------------------------
* 소수점 1000자리의 π *
* -------------------------------
*/
#include <stdio.h>
void ladd(short *,short *,short *);
void lsub(short *,short *,short *);
void ldiv(short *,short,short *);
void printresult(short *);
#define L 1000 /* 구하고자 하는 자리수 */
#define L1 ((L/4)+1) /* 배열크기 */
#define L2 (L1+1) /* 배열크기 + 1 */
#define N (short)(L/1.39794+1) /* 계산하려는 항의 수 */
int main(void)
{
static short s[L2+2],w[L2+2],v[L2+2],q[L2+2];
short k;
for (k=0;k<=L2;k++)
s[k]=w[k]=v[k]=q[k]=0;
w[0]=16*5; v[0]=4*239; /* 마친의 공식 */
for (k=1;k<=N;k++){
ldiv(w,25,w);
ldiv(v,239,v);ldiv(v,239,v);
lsub(w,v,q);ldiv(q,2*k-1,q);
if ((k%2)!=0) /* 홀수항인지 짝수항인지 판정 */
ladd(s,q,s);
else
lsub(s,q,s);
}
printresult(s);
return 0;
}
void printresult(short c[]) /* 결과 출력 */
{
short i;
printf("%3d. ",c[0]); /* 최상위 자리 출력 */
for (i=1;i<L1;i++)
printf("%04d ",c[i]);
printf("\n");
}
void ladd(short a[],short b[],short c[]) /* 긴 자리수 덧셈 */
{
short i,cy=0;
for (i=L2;i>=0;i--){
c[i]=a[i]+b[i]+cy;
if (c[i]<10000)
cy=0;
else {
c[i]=c[i]-10000;
cy=1;
}
}
}
void lsub(short a[],short b[],short c[]) /* 긴 자리수 뺄셈 */
{
short i,brrw=0;
for (i=L2;i>=0;i--){
c[i]=a[i]-b[i]-brrw;
if (c[i]>=0)
brrw=0;
else {
c[i]=c[i]+10000;
brrw=1;
}
}
}
void ldiv(short a[],short b,short c[]) /* 긴 자리수 나눗셈 */
{
short i;long d,rem=0;
for (i=0;i<=L2;i++){
d=a[i];
c[i]=(d+rem)/b;
rem=((d+rem)%b)*10000;
}
}
// pi값을 소수점 이하 1000자리까지 정확하게 구현한다.
부호는 n이 홀수면 양, 짝수면 음이 된다.