當前位置:編程學習大全網 - 編程語言 - C語言:鍵入[0,449]間的兩整數,輸出它們的階乘差;當結果>30時截斷30位小數按科學計數格式顯示。咋弄?

C語言:鍵入[0,449]間的兩整數,輸出它們的階乘差;當結果>30時截斷30位小數按科學計數格式顯示。咋弄?

壹是考慮到結果數位跨度很大,為提高空間效率用動態數組。二是必須用大數運算處理。三是顯示格式有壹定難度。代碼如下,供參考——

代碼文本:

#include "stdio.h"

#include <stdlib.h>

#include "math.h"

int *FactorialLN(int n,int &ln){

int i,j,*pa;

double dec=0;

for(ln=2;ln<=n;dec+=log10(ln++));

ln=((int)dec+1)/4+1;

if(!(pa=(int *)malloc(sizeof(int)*ln))){

printf("Application memory failure...\n");

return NULL;

}

for(i=0;i<ln;*(pa+i++)=0);

for(ln--,pa[ln]=1,j=2;j<=n;j++){

for(i=ln;i>=0;pa[i--]*=j);

for(i=ln;i>0;i--)

if(pa[i]>9999){

pa[i-1]+=pa[i]/10000;

pa[i]%=10000;

}

}

ln++;

return pa;

}

int main(int argc,char *argv[]){

int m,r,i,j,e,*pm,*pr;

while(1){

printf("Please enter m & r(int 0<=m,n<450)...\n");

if(scanf("%d%d",&m,&r)==2 && m>=0 && m<450 && r>=0 && r<450)

break;

printf("Error, redo: ");

}

printf("%d! - %d! = ",m,r);

if(m<r){

j=m,m=r,r=j;

putchar('-');

}

if((pm=FactorialLN(m,m)) && (pr=FactorialLN(r,r))){

for(i=m-1,j=r-1;j>=0;pm[i--]-=pr[j--]);

free(pr);

for(i=m-1;i>0;i--)

if(pm[i]<0){

pm[i-1]--;

pm[i]+=10000;

}

for(i=0;pm[i]==0;i++);

if(i<m){

if((e=m-i)<<2 > 30){//科學計數格式

for(j=1000;(r=pm[i]/j)==0;j/=10);

printf("%d.",r);

for(j/=10,r=0;j>0;printf("%d",pm[i]/j%10),j/=10,r++);

((e*=4)-=4)+=r;

for(i++,j=1000;r<30;printf("%d",pm[i]/j%10),r++)

if((j/=10)==0)

i++,j=1000;

printf("e%3d",e);

}

else//直接輸出格式

for(printf("%d",pm[i++]);i<m;printf("%4d",pm[i++]));

}

else

printf("0");

printf(".\n");

free(pm);

}

else{

printf("Application memory failure, exit...\n");

if(pm)

free(pm);

if(pr)

free(pr);

}

return 0;?

}

  • 上一篇:青島西海岸新區職業中等專業學校電話
  • 下一篇:數據挖掘的應用有哪些?
  • copyright 2024編程學習大全網