自從換了linux,就沒寫過題解。今天開始要繼續寫。
首先,求一個數的階層裡面每個素數因子的個數,那麼我們就可以求從2開始到這個數的每個數的素數因子的個數,相應加和。比如是10!= 1*2*3*4*5*6*7*8*9*10, 那麼 這裡面2的個數就是2,4, 6, 8, 10裡面2的因子數的加和1+2+1+3+1=8。依次類推
接下來就是求每個數的素因子及其個數,模板即可。不是很難的題目
其次要注意的輸出格式,這裡我犯了一個錯誤,沒有仔細考慮如果輸出的數的個數恰好是15的倍數,那麼最後一行就不應是再輸出換行了;還有在輸出換行的時候要注意的當k是15的倍數的時候,只輸出一個換行,因為k不是每次迴圈值都改變的,所以如果寫在if的外面,就會有很多換行輸出,不可取!因此,這個輸出的處理應該是每當有要輸出的數的時候,判斷一下是第幾個,如果k對15取餘為1,說明可以換行了,然後再輸出這個數,就避免了剛剛是15的倍數的情況!
核心代碼如下:
int anss[101];int main(){prime_sieve();int n;while ( scanf("%d",&n) != EOF && n ) {for ( int i = 2; i <= 100; ++i ) if (!is_prime(i) ) anss[i] = -1; else anss[i] = 0; for ( int i = 2; i <= n; ++i ) {IIV ans;prime_factorize(i, ans);int len = ans.size();for ( int i = 0; i < len; ++i ) anss[ans[i].first]+=ans[i].second;}printf("%3d! =", n);for ( int i = 2, k = 0; i <= n; ++i ) {if ( anss[i] != -1 ) { k++; if ( k > 1 && k % 15 == 1 ) printf("\n "); printf("%3d", anss[i]);}}printf("\n");} return 0;}