【20180807模擬測試】t1 function

low逼的我也只能寫這樣的水題。。。

題面

對於一個整數,定義 f(x)爲他的每個數位的階乘的乘積。例如 f(135)=1! * 3! * 5! =720。給出一個數 a(可以包含前綴零),a 滿足他的至少一個數位大於 1。我們要求出最大 的整數 x,其中 x 不含 0 或 1,並且滿足 f(a) = f(x)。
【輸入】
第一行一個整數 n,表示 a 的長度。 接下來一個整數 a。
【輸出】
一行一個整數 x 表示答案。
【輸入樣例 1】
4
1234
【輸出樣例 1】
33222
【樣例 1 說明】
1! * 2! * 3! * 4! = 3! * 3! * 2! * 2! * 2!

分析

算了吧,你看着我無比整齊的代碼會明白的
emm,以下官方正解

統計出質數 2、3、5、7 作爲因子出現了多少次。
我們 claim 最後的答案一定由這四個數字構成。(比如考慮 8,還不如 7222)。
我們看看可以放幾個 7,能放幾個放幾個,然後我們就沒有 7 了。
我們看看可以放幾個 5,能放幾個放幾個,然後我們就沒有 5 了。
我們看看可以放幾個 3,能放幾個放幾個,然後我們就沒有 3 了。
最後再把剩下的 2 全放上去。

關於考試時的思路

親測9!=7!*3!*3!*2!
8!=7!*2!*2!*2!
。。。
以此類推9個數而已3分鐘就推完了
反正寧願要多位數不要大的個位數
哪那麼多廢話
拆了
然後就只剩2,3,5,7開始拼湊(這和你拆的時候是個反向過程)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],b[1001],n,c[100100],cnt=0;
int main(){

    scanf("%d",&n);
    for(int i=1;i<=n;i++){
       char x;
       cin>>x;
       a[i]=x-'0';
       if(a[i]==2){b[2]++;}
       if(a[i]==3){b[2]++;b[3]++;}
       if(a[i]==4){b[2]+=3;b[3]++;}
       if(a[i]==5){b[2]+=3;b[3]++;b[5]++;}
       if(a[i]==6){b[2]+=4;b[3]+=2;b[5]++;}
       if(a[i]==7){b[2]+=4;b[3]+=2;b[5]++;b[7]++;}
       if(a[i]==8){b[2]+=7;b[3]+=2;b[5]++;b[7]++;}
       if(a[i]==9){b[2]+=7;b[3]+=4;b[5]++;b[7]++;}
    }
    for(int i=7;i>=2;i--){
       while(b[i]>0){
        c[++cnt]=i;
        if(i==2){b[2]--;}
        if(i==3){b[2]--;b[3]--;}
        if(i==4){b[2]-=3;b[3]--;}
        if(i==5){b[2]-=3;b[3]--;b[5]--;}
        if(i==6){b[2]-=4;b[3]-=2;b[5]--;}
        if(i==7){b[2]-=4;b[3]-=2;b[5]--;b[7]--;}
       }
    }
    for(int i=1;i<=cnt;i++)
    printf("%d",c[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章