PTAL1-006 连续因子

9efbcbc3d25747719da38c01b3fa9b4f.gif

 c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343

给大家分享一句我很喜欢我话:

知不足而奋进,望远山而前行!!!

铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!!

今天我们更新了连续因子内容,

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

一、题目描述

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

二、本题代码

C++版本:

#include<bits/stdc++.h>

using namespace std;

int prime(int n)
{
    int i;
    for (i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
            return 0;
    }
    return 1;
}

int main()
{
    long long n, i, j;
    cin >> n;
    int start = 0, l = 0;
    long long s = 1;
    
    if (prime(n))
        cout << "1\n" << n << endl;
    else
    {
        
        for (i = 2; i <= sqrt(n); i++)
        {
            s = 1;
            for (j = i; s * j <= n; j++)
            {
                s = s * j;
                
                if (n % s == 0 && j - i + 1 > l)
                {
                    start = i;
                    l = j - i + 1;
                }
            }
        }
        cout << l << endl;
        
        for (i = start; i < start + l; i++)
        {
            if (i == start)
                cout << i;
            else
                cout << "*" << i;
        }
        cout << endl;
    }
    return 0;
}
#include<bits/stdc++.h>

using namespace std;

int prime(int n)
{
    int i;
    for (i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
            return 0;
    }
    return 1;
}

int main()
{
    long long n, i, j;
    cin >> n;
    int start = 0, l = 0;
    long long s = 1;
    
    if (prime(n))
        cout << "1\n" << n << endl;
    else
    {
        
        for (i = 2; i <= sqrt(n); i++)
        {
            s = 1;
            for (j = i; s * j <= n; j++)
            {
                s = s * j;
                
                if (n % s == 0 && j - i + 1 > l)
                {
                    start = i;
                    l = j - i + 1;
                }
            }
        }
        cout << l << endl;
        
        for (i = start; i < start + l; i++)
        {
            if (i == start)
                cout << i;
            else
                cout << "*" << i;
        }
        cout << endl;
    }
    return 0;
}

C语言版本:

#include <stdio.h>
#include <math.h>

int is_prime(int n) {
    int i;
    for (i = 2; i <= sqrt(n); i++) {
        if (n % i == 0)
            return 0;
    }
    return 1;
}

int main() {
    long long n, i, j;
    scanf("%lld", &n);
    int start = 0, l = 0;
    long long s = 1;

    if (is_prime(n))
        printf("1\n%lld\n", n);
    else {
        for (i = 2; i <= sqrt(n); i++) {
            s = 1;
            for (j = i; s * j <= n; j++) {
                s = s * j;

                if (n % s == 0 && j - i + 1 > l) {
                    start = i;
                    l = j - i + 1;
                }
            }
        }
        printf("%d\n", l);

        for (i = start; i < start + l; i++) {
            if (i == start)
                printf("%lld", i);
            else
                printf("*%lld", i);
        }
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
#include <math.h>

int is_prime(int n) {
    int i;
    for (i = 2; i <= sqrt(n); i++) {
        if (n % i == 0)
            return 0;
    }
    return 1;
}

int main() {
    long long n, i, j;
    scanf("%lld", &n);
    int start = 0, l = 0;
    long long s = 1;

    if (is_prime(n))
        printf("1\n%lld\n", n);
    else {
        for (i = 2; i <= sqrt(n); i++) {
            s = 1;
            for (j = i; s * j <= n; j++) {
                s = s * j;

                if (n % s == 0 && j - i + 1 > l) {
                    start = i;
                    l = j - i + 1;
                }
            }
        }
        printf("%d\n", l);

        for (i = start; i < start + l; i++) {
            if (i == start)
                printf("%lld", i);
            else
                printf("*%lld", i);
        }
        printf("\n");
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值