题干:

数的分解

时间限制: 1000 ms  |  内存限制:65535 KB
难度: 1
 
<dl class="problem&#45;display" style="color&#58;rgb&#40;0&#44;0&#44;0&#41;&#59;font&#45;family&#58;Verdana&#44; Arial&#44; Helvetica&#44; sans&#45;serif&#59;font&#45;size&#58;14px&#59;background&#45;color&#58;rgb&#40;255&#44;255&#44;255&#41;&#59;"> <dt> 描述 </dt> <dd>

你的任务是找到一个最小的正整数Q,使Q的各位数的乘积等于N。

</dd> </dl>
 
<dl class="others" style="color&#58;rgb&#40;0&#44;0&#44;0&#41;&#59;font&#45;family&#58;Verdana&#44; Arial&#44; Helvetica&#44; sans&#45;serif&#59;font&#45;size&#58;14px&#59;background&#45;color&#58;rgb&#40;255&#44;255&#44;255&#41;&#59;"> <dt> 输入 </dt> <dd> 最多450组测试数据。数据以EOF结尾。
输入一个整数N(0 ≤ N ≤ 400)。 </dd> <dt> 输出 </dt> <dd> 输出Q,如果Q不存在则输出−1。 </dd> <dt> 样例输入 </dt> <dd>
10
5
</dd> <dt> 样例输出 </dt> <dd>
25
5
</dd> </dl>


法1:

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){

       int i = 0,ge,shi,bai,qi;
       for(;i <= 10000 && n;i++){
             if(i < 10){
                if(i == n)    
                   break;
          }
          else if(i < 100){
               ge = i % 10;
               shi = i / 10;
               if(ge * shi == n)
                  break;
          }
          else if(i < 1000){
             ge = i % 10;
               shi = (i / 10)%10;
               bai = i / 100;
               if(ge * shi * bai == n)
                  break;
          }
          else {
               ge = i % 10;
               shi = (i / 10)%10;
               bai = (i / 100)%10;
               qi = i / 1000;
               if(ge * shi * bai * qi== n)
                  break;
          }
       }
       if(i==10001)
          cout<<-1<<endl;
       else if(n==0)
          cout<<10<<endl;
       else
             cout<<i<<endl;
    }
    
    return 0;
}


法2:

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int res[10];

int main()
{
    int n;
    while(scanf("%d", &n) !=    EOF)
    {
        memset(res, 0, sizeof(res));
        if(n == 0)    
        {printf("10\n"); continue;} //易错
        else if(n < 10)    
        {printf("%d\n", n); continue;}
        else
        {
            int tmp = n;
            for(int i = 9; i >= 2; ) // 统计2-9的因子个数(倒序是关键~)
            {
                if(tmp % i == 0)
                {
                    res[i]++;
                    tmp /= i;
                }
                else
                    i--;
            }
            if(tmp > 10) {printf("-1\n"); continue;}
            for(int i = 2; i <= 9; ++i) //从小到大输出每个因子即可
                for(int j = 1; j <= res[i]; ++j)
                    printf("%d", i);
            printf("\n");
        }
    }
    return 0;
}

提炼:统计因子的模板:

            int tmp = x;//用res[]数组,统计x的因子
            for(int i = 2; i <= 9; ) // 统计2-9的因子个数(倒序是关键~)
            {
                if(tmp % i == 0)
                {
                    res[i]++;
                    tmp /= i;
                }
                else
                    i++;
            }