用大數操作,不論 n 多大,只要陣列夠塞一定能解出
想參考關鍵程式碼部分請反白
int ans[SIZE], tail=SIZE-1;
ans[tail]=1; /* 從尾巴開始做運算 */
if(m>n/2)
m=n-m;
for(i=n;i>n-m;i--) /* 從 n 往下乘,這裡相當於 n!/ (n-m)!*/
{
for(j=tail;j>=0;j--)
ans[j]=ans[j]*i;
for(j=tail;j>=0;j--)
{
if (ans[j] >= 10) /* 位數超過 10 要進位 */
{
ans[j-1]=ans[j-1]+(ans[j]/10);
ans[j]=ans[j]%10;
}
}
}
while(m>1) /* 再除掉 m! */
{
for(i=0;i<SIZE;i++)
if(ans[i]!=0) break;
for(j=i;j<SIZE-1;j++)
{
if(ans[j]<m) /* 若位數不夠除,跟下一位合併 */
{
ans[j+1]+= ans[j]*10;
ans[j]=0;
continue;
}
ans[j+1]+= (ans[j]%m)*10;
ans[j]= ans[j]/m;
}
ans[SIZE-1]= ans[SIZE-1]/m;
m--;
}