#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int isPrime(int n);//判断素数
int main()
{
int n, temp, count = 0, a[20], max = 0, flag;
scanf("%d", &n);//输入数字
if (isPrime(n))//如果是素数,直接按照题意输出就行了
{
printf("1\n%d", n);//按题意输出
return 0;//结束
}
for (int i = 2; i <= sqrt(n); i++)//遍历
{
temp = n;//每次都必须初始化temp和count
count = 0;
for (int j = i; j <= sqrt(n); j++)
{
if (temp % j == 0)//辗转相除的思想
{
count++;//计数加一
temp /= j;//商
}
else
break;
}
if (count > max)
{
max = count;//改变最大计数值
flag = i;//flag是第一个要输出的数的标记
}
}
printf("%d\n", max);//输出最大值
for (int i = flag; i < flag+max-1; i++)
printf("%d*", i);//输出到n-1位
printf("%d", flag + max - 1);//输出第n位
return 0;
}
int isPrime(int n)//判断素数
{
if (n == 1)
return 0;
for (int div = 2; div <= sqrt(n); div++)
if (n % div == 0)
return 0;
return 1;
}
#include<bits/stdc++.h>
using namespace std;
vector<int> ans; //向量容器vector
/* vector 1)可以直接访问任何元素。 2)线性顺序结构。可以指定一块连续的空间,也可以不预先指定大小,空间可自动扩展,也可以像数组一样被操作,即支持[ ]操作符和vector.at(),因此可看做动态数组,通常体现在追加数据push_back()和删除末尾数据pop_back()。 3)当分配空间不够时,vector会申请一块更大的内存块(以2的倍数增长),然后将原来的数据拷贝到新内存块中并将原内存块中的对象销毁,最后释放原来的内存空间。因此如果vector保存的数据量很大时会很消耗性能,因此在预先知道它大小时性能最优。 4)节省空间。因为它是连续存储,在存储数据的区域是没有浪费的,但实际上大多数时候是存不满的,因此实际上未存储的区域是浪费的。 5)在内部进行插入和删除的操作效率低。由于vector内部按顺序表结构设计,因此这样的操作基本上是被禁止的,它被设计成只能在后端进行追加和删除操作。 */
int main()
{
int num; cin>>num;//输入数字
for(int i=2;i<=num/i;i++)
{
if(num%i==0)
{
vector<int> temp;//vector容器temp 每一轮更新
int m=num;
for(int j=i;m%j==0;j++)//直到被整除
{
temp.push_back(j);//给temp尾部添加j元素;
m/=j;//找余数
}
if(temp.size()>ans.size()) ans=temp;//ans的元素个数大于temp元素个数,ans改变
}
}
if(ans.empty()) ans.push_back(num); //此数没有因子,所以输出时只用输出自己即可
//empty()判断容器是否为空 为空返回true,为假返回false
cout<<ans.size()<<endl;//输出ans元素个数
cout<<ans[0];//输出第一个元素
for(int i=1;i<ans.size();i++) cout<<"*"<<ans[i];//遍历输出后面的元素
return 0;
}