L1-006. 连续因子

本题要求:

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

输入格式:

输入在一行中给出一个正整数N1<N<231)。

输出格式:

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

输入样例:

630

输出样例:

3
5*6*7

解题思路 :

其实就是求因子的方法上稍加修改,有如下几点地方需要注意:
    1. 我们求的是连续的因子,所以无论是否为因子都需要进行++操作
    2. 注意每次的temp都是因子。
    3. 除数的大小需要进行限制,如果不进行MAXSIZE的限制,则会超出运算时间。
    4. 题中最小的连续因子序列指的是第一次遇到的最长的连续因子序列
    5. 每次都用一个临时数组来记录连续因子的次数,遇到非连续或者循环终止后再判断来进行存入到主数组。

代码 :

#include<iostream>
#include<cstring>
#include<cmath>

using namespace std;

#define MAXSIZE 100

int main() {
    int n;
    cin >> n;
    int max = 0;
    int m2 = 1;
    int time = sqrt(n);
    int num[100] = {0};
    num[0] = n;
    while (m2 < time) {
        int temp = n;
        int m = 1 + m2;
        int tempMax = 0;
        int tempNum[100] = {0};
        while (temp != 1 && m <= time && m <= MAXSIZE) {
            if (temp % m == 0) {
                temp /= m;
                tempNum[tempMax] = m;
                tempMax++;
            } else {
                if (tempMax > max) {
                    max = tempMax;
                    for (int j = 0; j < max; j++) {
                        num[j] = tempNum[j];
                    }
                }
                tempMax = 0;
            }
            m++;
        }
        if (tempMax > max) {
            max = tempMax;
            for (int j = 0; j < max; j++) {
                num[j] = tempNum[j];
            }
        }
        m2++;
    }
    if (max == 0) {
        max = 1;
    }
    cout << max << endl;
    for (int j = 0; j < max; j++) {
        cout << num[j];
        if (j + 1 < max) {
            cout << '*';
        }
    }
    cout << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值