L1-006 连续因子 (20分) -- 两种方法

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<2​^31)

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

法1:暴力枚举每个首因数,“9输出1和3”:

#include <bits/stdc++.h>
#define fro(i, n) for(int i = 0; i < n; i++)
#define ifi if(i) cout << " ";
using namespace std;
typedef long long LL;
const int maxn = 1e4+10;
int main() {
    LL n; cin >> n;
    LL sqr = sqrt(0.5 + n); // 至根下n
    LL L = 0, start = n; // 尽量初始化,随后统一处理
    for(LL i = 2; i <= sqr; i++) {
        if(n % i) continue; // 不是因数的不处理

        LL m = n, j = i, tL = 0;
        while(1) {
            if(m % j) break;
            m /= (j++);
            tL++;
        }
        if(tL > L) { L = tL; start = i; } // 更新Answer
    }
    if(L == 0) L = 1; // 素数!
    cout << L << endl;
    for(LL i = start; i < start+L; i++) {
        if(i != start) cout << "*";
        cout << i;
    }
    return 0;
}

法二: 暴力枚举长度L

思路:由 n < 2^31 得到 L <= 12
于是:从长到短枚举长度 从小到大枚举因数
框架如下:

	Input();
	for(L:12~1)
	{
		for(start:2~sqr)
		{
			if(ok) break;
		}
		if(ok) break;
	}
	Print();

回归首发、、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值