由用戶從鍵盤輸入n,求n!的值!而且能夠盡量滿足用戶的需要!(比如求100!或者更大~~~)并在計算結束后,由用戶按鍵決定重新再計算或者退出~~~請各位幫幫忙~~~~~(請寫出全部程序代碼~~)謝謝了~~~~^_^
熱心網友
給你一個構想應該行得通: 由于一個比較大的數的階乘結果太大,位數也不穩定,你可以用一個鏈表來存儲這個數,鏈表的節類是long類, 每一個節點代表一位數, 如第二個節點代表個位,第二個節點代表十位,第三個節點代表百位。。。 當然一個long節點可以代表7~8位,但這樣稍微加重了一點你的腦力負擔。。。 如果你切實為用戶著想的話,建議你用第二種方法。 這里講第一種方法比較簡單。這個鏈表在乘一個數的時候,從鏈表的第一個節點(個位),每個節點都乘以這個數(鏈表節點里存的都是個位數,乘一個7位數還撐得下)。然后進位,進位有一定的方法,自己想吧,(這個程序n!中n的位數要小于8,想來你也用不著算這么大的數。。就算用得著你的電腦也未必算得出來。。。)我只有C++的版本,發出來你也不要,就這樣吧(真不幸你還用TC)/*12。26 12:51修改 程序絕對沒有錯。錯就錯在你都21世紀了還在用TC。。趕快去買張盜版VC碟算了,也就3塊錢,,剛才把你要的程序補齊了,能不能在TC里編譯就看你的命了。。。。*/#include void *malloc(int);void free(void *);struct node{unsigned long data;struct node *Next,*Pro;};struct link{struct node *First,*Current,*Last;};void Insert(struct link *x,struct node *y){y-Pro=x-Current,y-Next=x-Current-Next;if(x-Last==x-Current)x-Last=y;x-Current=x-Current-Next=y;}void Translate(struct link *x,unsigned long y){/*把y轉成鏈表形式附加到x后面,重要*/do{struct node *NewNode;NewNode=(struct node *)malloc(sizeof(struct node));NewNode-data=y%10;Insert(x,NewNode);}while((y/=10)=1);}main(){struct node FirstNode,*Forfree;struct link LongInt;unsigned long n,ncount;char c;do{/*帶表頭結點的雙向鏈表*/LongInt。First=LongInt。Last=LongInt。Current=FirstNode。Pro=FirstNode。Next=&FirstNode;printf("Please Input n : ");scanf("\n%d",&n);ncount=n;Translate(&LongInt,n);/*先把n轉成鏈表*/while (--ncount){/*這種語法也不知道TC20能不能正確編譯。。。*/unsigned long Ncarry=0;LongInt。Current=LongInt。First;do{LongInt。Current=LongInt。Current-Next;LongInt。Current-data*=ncount;/*先乘以ncount*/LongInt。Current-data+=Ncarry;/*再加上前一位的進位*/Ncarry=LongInt。Current-data/10;/*算出往后一位該進位的數*/LongInt。Current-data%=10;/*把結果的個位數存儲在當前位置*/}while(LongInt。Current!=LongInt。Last);if(Ncarry)Translate(&LongInt,Ncarry);/*把最高位數的進位數轉成鏈表附加到后面*/}for(;LongInt。Current!=LongInt。First;ncount++){Forfree=LongInt。Current;printf("%d",Forfree-data);LongInt。Current=LongInt。Current-Pro;free(Forfree);}/*倒序輸出,一邊輸出一邊析構*/printf("\n");printf(" %d digit of all,Would you like to calculate another one?(Y/N) : ",ncount);scanf("\n%c",&c);}while(c=='y'||c=='Y');}/*在后面點評一下樓下的觀點: 鏈表是最基本的數據結構之一,怎么能說復雜?程序是給用戶編的, 程序不是寫得越短就越好,而是對用戶越方便越省系統資源越好 ,你用數組程序也就短個十行八行的。 但多占了不少用戶的內存,或者可能存不下結果(今天心血來潮算了一下10000! ,有35660位數~~)*/。
熱心網友
用不著鏈表,太復雜了。可以用數組。如int arr[1000]第一個元素存儲4位數就夠了。
熱心網友
main(){ long plug; int i=0; ing baio=1; do(biao) { scanf("%i",&i); plug=i; for(;i=1;i--) { plug=plug*i; } printf("jie guo %d",plug); scanf("%d",biao);//s輸入0退出,其他繼續 }while;}