题目链接:https://www.patest.cn/contests/gplt/L1-006
L1-006. 连续因子
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1<N<231)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:630输出样例:
3 5*6*7
/*
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,
其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1<N<231)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
输入样例:
630
输出样例:
3
5*6*7
*/
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
int fac(int n){
int i;
int flag=1;
for(i=2;i<=sqrt(n);i++){
if(n%i==0){
flag=0;
return flag;
}
}
return flag;
}
int k;
int main()
{
int j;
cin>>j;
while(j--){
long long int n;
long long int i;
int a[1001];
int k=0;
memset(a,0,sizeof(a));
cin>>n;
if(fac(n)){
cout<<1<<endl;
cout<<n<<endl;
return 0;
}
for(i=2;i<=n/2+1;i++){
if(n%i==0){
a[k]=i;
k+=1;
}
}
int t=1;
int pt=0,pm=0;
int maxx=0;
for(i=0;a[i]!=0;i++){
if(a[i+1]-a[i]==1){
pt=i+1;
t=t+1;
}
if(a[i+1]-a[i]>1||a[i+1]==0){
if(t>maxx){
maxx=t;
pm=pt;
}
t=1;
pt=i+1;
}
}
/// for(i=0;a[i]!=0;i++){
/// cout<<a[i]<<" ";
/// }
/// cout<<endl;
int l=1,z=0;
for(i=pm-maxx+1;i<=pm;i++){
if(l*a[i]>n){
break;
}
l=l*a[i];
z++;
}
cout<<z<<endl;
int f=0;
l=1;
for(i=pm-maxx+1;i<=pm;i++){
if(l*a[i]>n){
break;
}
if(f!=0){
cout<<"*";
}
if(l*a[i]<=n){
cout<<a[i];
l=l*a[i];
}
f++;
}
cout<<endl;}
return 0;
}

该程序旨在找出正整数N的最长连续因子序列,并输出序列的长度及序列本身。输入一个正整数N,程序通过计算其因子并检查连续性,找到最小子序列并展示结果。
454

被折叠的 条评论
为什么被折叠?



