PTA团队天梯赛║L1-006 连续因子

PTA团队天梯赛║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的值的取值范围小于等于231,而这个值介于12的阶乘到13的阶乘之间,所以我们可以得到最大的值应该是12个数连续相乘,又因为1不计算在内,所以最多只要有11为连续因子即可。

用暴力的思想,我从2、3、4…sqrt(N)开始乘,连着乘以11位,10位,9位…以此类推。

即连续乘 11 位:

2 3 4 5 6 7 8 9 10 11 12相乘

3 4 5 6 7 8 9 10 11 12 13相乘

连续乘 10 位:

2 3 4 5 6 7 8 9 10 11相乘

3 4 5 6 7 8 9 10 11 12相乘

直到只有 1 位时,过程中只要有一个乘积 S 使得 N%S==0,就可以认为找到了连续因子。

为了优化代码,在每次乘的时候如果当前的乘积已经大于 N 了,就没有继续乘的必要了。

三、代码

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int N;
    cin >> N;
    int n = sqrt(N);
    int i, j;
    bool flag = false;
    long long int sum;  //注意数据类型!!
    for(int len=11; len>0; len--)   //用len控制连续因子个数,N最多只能到12阶乘
    {
        for(i=2; i<=n; i++) //连续因子不包括1,从2开始乘,最多乘到N的开方就足够
        {
            sum = 1;
            for(j=i; j<len+i; j++)    //从当前的i开始,乘以的个数为len的长度
            {
                sum*=j;
                if(sum>N) break;    //到这就没有必要往下算了
            }
            if(N%sum==0)    //当前的sum值是N的一个因子
            {
                cout << len << endl << i;
                for(int k=i+1; k<j; k++)
                {
                    cout << "*" << k;
                }
                cout << endl;
                flag = true;
            }
            if(flag) break;
        }
        if(flag) break;
    }

    return 0;
}

四、反思总结

在这里插入图片描述

v1.0最后两个测试点没有通过,还没有想通是哪里出现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值