eÀÇ 1000ÀÚ¸®±îÁö °è»ê
Å×ÀÏ·¯ Àü°³¿¡ ÀÇÇϸé e(ÀÚ¿¬·Î±× ¹Ø) °ªÀº
e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! + ...
·Î ±¸ÇØÁø´Ù.
449! < 10^1000 < 450!
ÀÌ´Ù. ¿©À¯ÀÖ°Ô 451Ç×±îÁö °è»êÇÑ´Ù.
¿©±â¼ ladd(), lsub(), ldiv(), printresult() °°Àº ÇÔ¼ö´Â pi °ªÀ» ±¸ÇÒ ¶§¿Í µ¿ÀÏÇÏ´Ù.
<¼Ò½ºÄÚµå>
#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) //
ÇϳªÀÇ ¿©ºÐÀ» °®´Â´Ù
#define N 451 //
°è»êÇÏ´Â ÇÔ¼ö
void main(void)
{
static short
s[L2+2], w[L2+2];
short k;
for(k=0;
k<=L2; k++)
s[k] = w[k] = 0;
s[0]
= w[0] = 1;
for(k=1; k<=N; k++) {
ldiv(w,
k, w);
ladd(s, w, s);
}
printresult(s);
}
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;
}
}
- the end of this article -