#16447: C的,大數法


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
a623. 3. Combination -- HP CodeWars2007 | From: [27.52.77.116] | 發表日期 : 2019-01-02 01:28

用大數操作,不論 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--;

}

 
ZeroJudge Forum