è¿ä¸ªé®é¢ç´æ¥ç¨åéæ¥ç®æ¯é误çï¼æ´å½¢æè
é¿æ´å½¢æ²¡æè¿ä¹å¤§ï¼26çé¶ä¹æ27ä½æ°åï¼ç¨doubleè½ç¶è½åä¸ï¼ä½æ¯æ失äºç²¾åº¦ï¼åé¢çæ°åæ¯ä¸åç¡®çï¼doubleè½ç¶ä¸éæ¯10ç308次æ¹ï¼ä½æ¯ææå°æ°åä½æ°åªæ14-15ä½çæ ·åï¼ä¹å°±æ¯ç¨ç±»ä¼¼ç§å¦è®¡æ°æ³æ¥ä¿åçï¼æ°åä¸åç¡®ãè¿ä¸ªåªè½ç¨æ°ç»èªå·±ä¸ä½ä¸ä½å°ç®ãä¸é¢æ¯ä¾å代ç ã
#include <stdio.h>
char* CalcFact(int n)
{
int a[100]; //ç¡®ä¿ä¿åæç»è¿ç®ç»æçæ°ç»è¶³å¤å¤§ï¼26çé¶ä¹æ27ä½ï¼è¿éè³å°è¦æ¯æ大ç»æåå¤1ä½
longint digit = 1; //ç»æçä½æ°
longint temp; //é¶ä¹çä»»ä¸å
ç´ ä¸ä¸´æ¶ç»æçæä½çä¹ç§¯ç»æ
longint i,j,carry; //i:1~nçæä¸é¶ä¹å
ç´ ï¼carry:è¿ä½
a[0] = 1; //å°ç»æå
åå§å为1
for(i = 2; i <= n; i++)
{ //å¼å§é¶ä¹ï¼é¶ä¹å
ç´ ä»2å¼å§ä¾æ¬¡"ç»åº"
//ææåºæ¬çä¹æ³è¿ç®ææ³æ¥èèï¼å°é¶ä¹å
ç´ iä¸ä¸´æ¶ç»æçæ¯ä½a[j-1]ç¸ä¹
for( j = 0, carry = 0; j < digit; j++)
{
temp = i * a[j] + carry; //ç¸åºé¶ä¹ä¸çä¸é¡¹iä¸å½åæå¾ä¸´æ¶ç»æçä»ä½å°é«åä½a[j-1]ä¾æ¬¡ç¸ä¹ï¼å ä¸è¿ä½ï¼
a[j] = temp % 10; //æ´æ°ä¸´æ¶ç»æçä½ä¸ä¿¡æ¯
carry = temp / 10; //æ´æ°ç¸ä¹åçè¿ä½
}
while(carry) //å¦ææè¿ä½
{
++digit; //æ°å ä¸ä½ï¼æ·»å ä¿¡æ¯ãä½æ°å¢1
a[digit-1] = carry % 10; //å°è¿ä½æ¾å¨æ°å çç»æä½ä¸
carry = carry/10; //çè¿è½ä¸è½è¿ä½
}
char myFact[digit+1];
temp=0;
for(j = digit; j >=1;j--)
{
myFact[temp]=a[j]+48; //+48ææ°ååæå符ï¼â0â=48ï¼ä»¥æ¤ç±»æ¨
temp++;
}
myFact[temp]='\0';
return myFact;
}
void main()
{
printf (â26!=%sâ, CalcFact(26));
printf (â20!=%sâ, CalcFact(20));
}
追é®è°¢è°¢ä½ ç详ç»è§£çï¼ä¸è¿ææ¯åå¦çCè¯è¨ï¼ä¸è½çè§£ä½ çç¨åºï¼è½å个ç®åçåï¼è°¢è°¢ã
追çå¦æéè¦ç²¾ç¡®ççæ¡ï¼è¿ä¸ªå·²ç»å¾ç®åäºï¼æ²¡åæ³æ´ç®åäºã
å¦æåªéè¦å¤§æ¦ççæ¡ï¼å°±å¾ç®åï¼ç´æ¥ç¨doubleåéä¹å°±å¯ä»¥äº