我的求圆周率的程序怎么不能运行?帮个忙!!
#include<iostream>#include<cstdio>
#include<cstdlib>
using namespace std;
#define USEFPU //条件编译,两种情况,一种是用浮点数,时间较短,另一种用整数,时间较长
#define ARC5 1
#if defined USEFPU //如果这样定义,则用浮点数
#define BASE 1000000000L
#define BASEDIGITS 9
typedef long int SHORT;
typedef double LONG;
#else //否则,用整型数
#define BASE 100
#define BASEDIGITS 2
typedef unsigned char SHORT;
typedef long int LONG;
#endif
typedef long int INDEXER;
class PI
{
private:
SHORT *pi, *powers, *term;
INDEXER size;
public:
PI(){size=0; pi= powers= term= NULL;}
PI(INDEXER nsize)
{ size= nsize;
size = ((size+ BASEDIGITS -1)/ BASEDIGITS) +1; //将位数变成为输出类型的元素个数
pi = new SHORT [size];
powers = new SHORT [size];
term =new SHORT [size];
}
~PI()
{ if(pi) delete []pi;
if(powers) delete []powers;
if(term) delete []term;
}
void SetSize(INDEXER nsize)
{ size= nsize;
size = ((size+ BASEDIGITS -1)/ BASEDIGITS) +1; //将位数变成为输出类型的元素个数
if(pi) delete []pi;
pi = new SHORT [size];
if(powers) delete powers;
powers = new SHORT [size];
if(term) delete term;
term =new SHORT [size];
}
void Show();
void OutDig( int dig);
void PrintShort(SHORT num);
void Print(SHORT *num);
void arctan(int multiplier, int denom, int sign); //multiplier为系数、denom为分母、sign为分子
};
void PI::Show( )
{ for (int x = 0; x < size; x++)
pi[x] = 0;
#if defined ARC3
arctan(8,3,1); //8是系数,1/3是自变量
arctan(4,7,1);
#elif defined ARC5
arctan(16,5,1);
arctan(4,70,-1);
arctan(4,99,1); //系数中已包含了要运行的公式
#elif defined ARC4
arctan(12,4,1);
arctan(4,20,1);
arctan(4,1985,1);
#elif defined ARC10
arctan(32,10,1);
arctan(4,239,-1);
arctan(16,515,-1);
#else
arctan(16,5,1);
arctan(4,239,-1);
#endif
Print(pi);
}
void PI::OutDig(int dig) //按位输出数字,将每位数字变成字符型
{ static int printed = 0;
putchar( dig +'0');
printed ++;
if ((printed%1000) ==0)
{ printed = 0;
printf("\n\n\n");
}
if(( printed%50) ==0)
printf("\n");
else if ((printed%10) ==0)
putchar(' ');
}
void PI::PrintShort(SHORT num) //将整型数变成字符型的数,放入数组digits[]并显示
{ int x;
int digits[BASEDIGITS + 1];
for( x =0; x< BASEDIGITS; x++)
{ digits[x] = num % 10;
num /=10;
}
for (x = BASEDIGITS -1; x >= 0; x--)
OutDig( digits[x]);
}
void PI::Print(SHORT * num)
{ INDEXER x;
printf("\nPI = 3. \n");
for (x =1; x < size; x++)
PrintShort(num[x]);
printf("\n");
}
void PI::arctan(int multiplier, int denom, int sign) //multiplier为系数、denom为分母、sign为分子
//本函数是程序的难点,将小数边成数据数组,放至数组中进行计算
{ INDEXER x;
LONG remain, temp, divisor,denom2;
SHORT NotZero = 1;
INDEXER adv;
for (x = 0; x < size; x++)
powers[x] =0;
divisor =1;
denom2 =(LONG)denom;
denom2 *=denom2;
adv = 0;
remain = (LONG)multiplier * denom; //第一项
while (NotZero)
{ for(x = adv;x < size; x++)
{ temp = (LONG)powers[x] + remain;
powers[x] = (SHORT)(temp/denom2);
remain = (temp - ( denom2 * (LONG)powers[x])) * BASE; //将运算结果变为整数
}
remain = 0;
for (x =adv;x < size;x++)
{ temp = (LONG)powers[x] + remain;
term[x] = (SHORT)(temp/divisor);
remain = (temp - (divisor * (LONG)term[x]))*BASE;
}
remain =0;
if (sign >0)
{ LONG carry,sum;
carry =0;
for (x =size -1;x >=0;x--) //从低位循环
{ sum = (LONG)pi[x] + (LONG)term[x] +carry;
carry = 0;
if (sum >= BASE) //如果有进位
{ carry = 1;
sum -= BASE;
}
PI[x] =(SHORT)sum;
}
}
else
{ LONG borrow, sum;
borrow = 0;
for (x =size -1; x >= 0;x--)
{ sum = (LONG)pi[x] - (LONG)term[x] - borrow;
borrow =0;
if (sum<0) //如果有错位
{ borrow =1;
sum +=BASE;
}
pi[x] = (SHORT)sum;
}
}
sign = -sign; //符号取反
divisor +=2; //分母加2
NotZero =0;
for (x = adv;x < size; x++)
{ if(powers[x])
{ break;
} NotZero = 1;
}
if (NotZero)
{ while (powers[adv] == 0) //跳过全为0的项
adv++;
}
}
}
int main(void)
{ PI pi(23);
pi.Show();
PI p1;
p1.SetSize(200);
p1.Show();
return 0;
}