在C語(yǔ)言里unsigned long int型的的整數(shù)的僅可表示0~4294967295之間的數(shù),而12! = 479001600,13! = 6227020800??梢?jiàn),用unsigned long int型的整數(shù)做階乘運(yùn)算時(shí)最多只能計(jì)算到12的階乘。用函數(shù)double sqrt(double x)做開(kāi)方算運(yùn)算時(shí),只能計(jì)算到16位有效數(shù)字。long double型的實(shí)數(shù)雖然可表示10-4931~10-4932的數(shù),但其有效數(shù)字也只有18~19位。
我編寫(xiě)了一個(gè)“天文數(shù)字計(jì)算”程序突破了這一限制,可以把數(shù)字的長(zhǎng)度擴(kuò)充到無(wú)窮多位。除了能做加、減、乘、除、求模等基本運(yùn)算外還可以做階乘、乘方、開(kāi)平方等運(yùn)算。
例如:10000! = ?、(2002^2000)%9999 = 9394、2002的平方根的小數(shù)點(diǎn)后第10000位是4。
下面這個(gè)程序只是我用編寫(xiě)的“天文數(shù)字計(jì)算”里的一個(gè)計(jì)算。
因?yàn)樵诔绦虼a中使用了中文,所以這個(gè)程序如果不在中文DOS下運(yùn)行,可能會(huì)出現(xiàn)亂碼,但不影響程序的計(jì)算結(jié)果。
注:因?yàn)镈OS能訪(fǎng)問(wèn)的內(nèi)存有限,所以在DOS下可把計(jì)算結(jié)果擴(kuò)充到30000多位。但如果用VC把它編繹成Windows程序,則可以計(jì)算到“真正的無(wú)窮多位”(與機(jī)子配置有關(guān)),一般計(jì)算到幾十萬(wàn)位是沒(méi)有問(wèn)題的。
/* 此程序在TC2.0、TC3.0,BC,VC下都可編繹 */
#define M 20000 /* 結(jié)果位數(shù),DOS能訪(fǎng)問(wèn)的內(nèi)存有限,不要超過(guò) 30000 位*/
#define N (M+5)
main()
{
int Num;
reGISter int i,j,k,flag;
register unsigned int n,m,pc;
unsigned char str_n[5],result_0[N],result_1[N];
void fun_print_result(char *result,int flag);
int fun_mul(char *a,char *b,char *c,int flag);
printf("輸入計(jì)算其階乘的數(shù):Num = ");
scanf("%d",&Num);
if(Num >= 100)
{
printf( "\n正在進(jìn)行階乘運(yùn)算. . .\n");
printf( "已完成 00000 的階乘,請(qǐng)等待. . .");
}
for (j=0;j {
result_1[j] = 0; result_0[j] = 0;
}
result_1[N-1] = 1;
for(i=0;i <5;i++)
{
str_n[i] = 0;
}
n = 1;
pc = 0; flag = N-1;
while (n <= Num)
{
m = n;
k = 4;
while(m > 0)
{
str_n[k] = m%10; m /= 10; k--;
}
if (pc%2 == 0)
{
if(fun_mul (str_n,result_1,result_0,flag) != 1)
{
printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}
else
{
if(fun_mul (str_n,result_0,result_1,flag) != 1)
{
printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}
我編寫(xiě)了一個(gè)“天文數(shù)字計(jì)算”程序突破了這一限制,可以把數(shù)字的長(zhǎng)度擴(kuò)充到無(wú)窮多位。除了能做加、減、乘、除、求模等基本運(yùn)算外還可以做階乘、乘方、開(kāi)平方等運(yùn)算。
例如:10000! = ?、(2002^2000)%9999 = 9394、2002的平方根的小數(shù)點(diǎn)后第10000位是4。
下面這個(gè)程序只是我用編寫(xiě)的“天文數(shù)字計(jì)算”里的一個(gè)計(jì)算。
因?yàn)樵诔绦虼a中使用了中文,所以這個(gè)程序如果不在中文DOS下運(yùn)行,可能會(huì)出現(xiàn)亂碼,但不影響程序的計(jì)算結(jié)果。
注:因?yàn)镈OS能訪(fǎng)問(wèn)的內(nèi)存有限,所以在DOS下可把計(jì)算結(jié)果擴(kuò)充到30000多位。但如果用VC把它編繹成Windows程序,則可以計(jì)算到“真正的無(wú)窮多位”(與機(jī)子配置有關(guān)),一般計(jì)算到幾十萬(wàn)位是沒(méi)有問(wèn)題的。
/* 此程序在TC2.0、TC3.0,BC,VC下都可編繹 */
#define M 20000 /* 結(jié)果位數(shù),DOS能訪(fǎng)問(wèn)的內(nèi)存有限,不要超過(guò) 30000 位*/
#define N (M+5)
main()
{
int Num;
reGISter int i,j,k,flag;
register unsigned int n,m,pc;
unsigned char str_n[5],result_0[N],result_1[N];
void fun_print_result(char *result,int flag);
int fun_mul(char *a,char *b,char *c,int flag);
printf("輸入計(jì)算其階乘的數(shù):Num = ");
scanf("%d",&Num);
if(Num >= 100)
{
printf( "\n正在進(jìn)行階乘運(yùn)算. . .\n");
printf( "已完成 00000 的階乘,請(qǐng)等待. . .");
}
for (j=0;j
result_1[j] = 0; result_0[j] = 0;
}
result_1[N-1] = 1;
for(i=0;i <5;i++)
{
str_n[i] = 0;
}
n = 1;
pc = 0; flag = N-1;
while (n <= Num)
{
m = n;
k = 4;
while(m > 0)
{
str_n[k] = m%10; m /= 10; k--;
}
if (pc%2 == 0)
{
if(fun_mul (str_n,result_1,result_0,flag) != 1)
{
printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}
else
{
if(fun_mul (str_n,result_0,result_1,flag) != 1)
{
printf( "\n\n結(jié)果溢出!當(dāng)前所設(shè)置的結(jié)果為 %d 位 已完成 %d 的階乘",M,pc);
exit(0);
}
}