题解:SP18273 SNGINT - Encode Integer

· · 题解

本题很水。

首先,我们拿到了这个题目。我们发现,其实,这是一道来分解因数的题目(因为要让 m 的各位数相乘等于 n),但是要求个数最少(m 的位数要最少)而且排列的值(即 m 的值)最小,而且每个数都要小于 10。
所以,我们其实应该这么做:

首先,我们要创建一个数组,来保存每个数(2\sim9)被分解了几次。

int a[10];
memset(a,0,sizeof(a));//数组置零

接着,我们来分解因数。

for(int i=9;i>=2;i--){//从大到小是因为如果从小到大,可能位数会多,例如8会变成3个2
  while(n%i==0){//循环判断是否能除下
    a[i]++;//对应的数出现的次数+1
    n/=i;//
  }
}
if(n>1)cout<<"-1";//如果n还有其他的因数,输出无解
else{
  for(int i=2;i<=9;i++)//从2枚举到9,输出字典序最小的一个m
  for(int j=1;j<=a[i];j++)//有a[i]个
    cout<<i;//输出i
}

但是由于 1 和 0 不能用这段代码 AC,所以要加个特判。

if(n==1)cout<<n;//直接输出就好了
else if(n==0)cout<<"10";//正整数,我以前就被坑了

当然,不能忘记换行!

cout<<"\n";

好了,一道水题拿下!