题干:
数的分解
时间限制: 1000 ms | 内存限制:65535 KB
难度: 1
你的任务是找到一个最小的正整数Q,使Q的各位数的乘积等于N。
</dd> </dl>输入一个整数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++;
}
。