PTA | 连续因子

目录

题目:

输入格式:

输出格式:

输入样例:

输出样例:

代码:

无注释版:

有注释版:


题目:

一个正整数 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

代码长度限制16 KB,时间限制400 ms,内存限制64 MB,栈限制8192 KB

代码:

C++ (clang++)

无注释版:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	int n;
	cin>>n;
	int ma=0,t=0;
	for(int i=2;i*i<=n;i++){
		int k=1,len=0;
		for(int j=i;k*j<=n;j++){
			k*=j;
			len++;
			if(n%k==0&&len>ma){
				ma=len;
				t=i;
			}
		}
	}
	if(ma==0){
		cout<<"1\n"<<n<<"\n";
	}
	else{
		cout<<ma<<"\n";
		for(int i=0;i<ma;i++){
			if(i>0) cout<<"*";
			cout<<t+i;
		}
		cout<<"\n";
	}
}
有注释版: 
#include<bits/stdc++.h>  // 引入所有标准库头文件,包含输入输出和容器等
using namespace std;     // 使用标准命名空间

#define int long long     // 将 int 定义为 long long,支持更大的数字范围

signed main() {
    int n;
    cin >> n;              // 输入一个正整数 N
    
    int ma = 0, t = 0;      // ma 用来记录最长连续因子的长度,t 用来记录最小的连续因子的起始值
    
    // 外循环遍历所有可能的因子 i,i 的范围是从 2 到 sqrt(n),因为因子的配对形式
    // (i, n / i) 一定在 sqrt(n) 内。
    for (int i = 2; i * i <= n; i++) {
        int k = 1, len = 0;  // k 用来存储因子的积,len 用来记录当前连续因子的长度
        
        // 内循环,寻找从 i 开始的连续因子。j 从 i 开始,逐渐增大
        for (int j = i; k * j <= n; j++) {
            k *= j;            // 乘以当前的因子 j
            len++;             // 增加因子的个数
            
            // 如果当前积 k 可以整除 n,且连续因子的长度 len 更大,则更新 ma 和 t
            if (n % k == 0 && len > ma) {
                ma = len;      // 更新最长连续因子的长度
                t = i;         // 更新最小连续因子序列的起始因子
            }
        }
    }
    
    // 如果没有找到连续因子(ma == 0),则输出 1 和 N 本身
    if (ma == 0) {
        cout << "1\n" << n << "\n";  // 输出 1 和 N
    }
    else {
        cout << ma << "\n";           // 输出最长连续因子的个数
        
        // 输出最小的连续因子序列
        for (int i = 0; i < ma; i++) {
            if (i > 0) cout << "*";    // 除了第一个因子,前面的因子之间要输出 '*'
            cout << t + i;              // 输出当前因子
        }
        cout << "\n";                   // 输出换行
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值