問題1描述:
給定整數n,n求n!末尾有幾個0。例如n=10,n!=3628800,n!末尾有兩個0
分析:
一、將n!分解質因數,n!=(2^x)*(3^y)*(5^z)......,由於10=2*5,所以問題也就是求m=min(x,z),容易看出x大於等於z,所以也就是求z
#include int main()
} printf("%d\n",ret);
return 0;
}
二、利用公式z=[n/5]+[n/5^2]+[n/5^3]+......
#include int main()
printf("%d\n",ret);
return 0;
}
問題2描述:
求n!的二進位制表示中最低位1的位置
分析:問題2與問題1的區別只是進製上的不同,對於問題1,答案其實就是n!含有多少個10,那麼對於問題2答案就是n!含有多少個2了。
一、利用公式:n/2+n/4+n/16+......
#include int main()
printf("%d\n",ret);
return 0;
}
二、對n/2+n/4+n/16+......發現,假設n=11011,
即:1101+110+11+1=(1000+100+1)+(100+10)+(10+1)+1
=(1000+100+10+1)+(100+10+1)+1=1111+111+1
=(10000-1)+(1000-1)+(10-1)+(1-1)=11011-(n二進位制表示中1的個數)
#include int main()
printf("%d\n",n-ret);
return 0;
}
程式設計之美2 2 不要被階乘嚇倒
對n 進行質因數分解,n 可以分解成2 x 3 y 5 z 只有2 5才會使n 的末尾產生1個0,也就是說n 的質因數分解中有多少個2,5對末尾就有多少個0,而n 的質因數中5的個數要少於2的 個數,也就是說2,5對的個數取決於質因中5的個數,所以問題轉化為求n 中質因數5的個數 5的個數z n 5...
程式設計之美 2 2 不要被階乘嚇倒
題目 1.給定乙個整數n,那麼n的階乘n!末尾有多少個0?2.求n 的二進位制表示中最低位1的位置。分析與解答 對於題目1 最簡單直接的方法,算出n!再看10的倍數關係。複雜度雖然不高,但致命的問題是溢位。在n不到100的時候就會引起溢位,所以雖然這是乙個正確的方法,但在實際中卻不能使用。這時就需要...
程式設計之美 set 1 不要被階乘嚇倒
總結 1.使用加法 解決指數問題時,可用揹包問題的變形 2.題目用到的公式和求解 1 n 中 1 出現的次數的公式類似 題目1.給定乙個整數 n,那麼 n 的階乘 n 末尾有多少個 0 呢 2.求解 n 的二進位制表示中最低位 1 的位置 思路1.第一道題相當於求解 n 分別是 2 a 和 5 b,...