一个很短的问题
时限:1000ms内存限制:10000K总时限:3000ms
描述:
找到最小的正整数Q,使得Q的各位数的乘积等于N
输入:
一个数N(0<=N<=1000000000)
输出:
一个数Q如果不存在Q,输出-1
输入样例:
10
输出样例:
25
code:
#include
#include
#include
using namespace std;
int const INIT_SIZE = 50;
//获取data的最大质因子
int getMaxPrimeFactor(int data)
{
for(int i = 2;i <= sqrt(double(data));i++)
{
int j = data / i;
if(data % i == 0)
{
int x = getMaxPrimeFactor(j);
int y = getMaxPrimeFactor(i);
return x > y ? x : y;
}
}
return data;
}
//找到最小的正整数Q,使得Q的各位数的乘积等于data
//Q的每位数均存储在arr数组中
bool minQ(int &data,int *&arr,int &length)
{
int array[100];
int index = 0;
arr = new int[INIT_SIZE];
length = 0;
while(true)
{
int temp = getMaxPrimeFactor(data);
if(temp >= 10)
return false;
array[index++] = temp;
if(temp == data)
break;
data = data / temp;
}
int temp = array[0];
for(int i = 1;i < index;i++)
{
if(temp * array[i] < 10)
temp *= array[i];
else
{
arr[length++] = temp;
if(i < index)
temp = array[i];
}
}
arr[length++] = temp;
return true;
}
//输出最小值
void print(int *array,int length)
{
//插入排序
for(int i = 1;i < length;++i)
{
int j = i;
int temp = array[i];
for(;j > 0 && temp < array[j - 1];j--)
array[j] = array[j - 1];
array[j] = temp;
}
//最小输出
for(int i = 0;i < length;i++)
cout<
}
int main(int argc,char *argv[])
{
int data;
while(true)
{
int length = 0;
int *array;
cin>>data;
if(data == 0)
cout<<10<
else if(minQ(data,array,length))
print(array,length),cout<
else
cout<
delete array;
}
system("pause");
}