团体程序设计天梯赛-L1-006 连续因子

L1-006 连续因子

题目链接-L1-005 考试座位号
在这里插入图片描述
解题思路

  • 先判断n是否为素数,若为素数直接输出1 n
  • 若不为素数,一个for循环找n的因数i,因为是连续因子个数然后i乘到n,每乘一次判定当前乘积pre是否为n的因子(即N%pre是否为0)
    1. 若pre为n的因子,比较上一次乘积因子序列的长度,若大于,则记录;
    2. 若pre不是n的因子就结束内层循环继续找下一个因子
  • 判断pre是不是n的因子其实就意味着判断乘上去的那个连续的因子成不成立
  • 不断更新乘积因子序列长度,直到最后一个因子为n

附上代码

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int isprime(int x){
	if(x==1)
		return 0;
	for(int i=2;i*i<=x;i++)
		if(x%i==0)
			return 0;
	return 1;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int n;
	cin>>n;
	if(isprime(n)){
		cout<<1<<endl<<n;
		return 0;
	}
	int len=0,pre,x;
	//len记录最大长度,pre记录连续因子乘积,x记录连续因子开头数字
	for(int i=2;i*i<=n;i++){
		if(n%i==0){//如果i是n的因子
			pre=i;
			int j;
			for(j=i+1;j*j<=n;j++){
				pre*=j;
				if(n%pre!=0)//判断j的合理性
					break;
			}
			if(j-i>len){//比较长度
				len=j-i;
				x=i;
			}
		}
	}
	cout<<len<<endl;
	for(int i=x;i<=x+len-1;i++){
		if(i!=x)
			cout<<"*";
		cout<<i;
	}
	return 0;
}
发布了88 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104622608