PAT甲级备考——逻辑题

PAT甲级备考——逻辑题

题目

PAT (Advanced Level) Practice

【1093】求如APAAPPT中可以组成多少个PAT,分别保存每个字符之前P的数目,和之后T的数目(😀)
【1096】求num中,k个连续的阶乘
【1109】 两次排序 、依照某一规则打印(😀)
【1116】
【1117】
【1128】
【1146】判断是否是拓扑排序(😀)
【1148】

【1096】求num中,k个连续的阶乘

⼀个正整数N的因⼦中可能存在若⼲连续的数字。例如630可以分解为356*7,其中5、6、7就是3个连续的数字。给定任⼀正整数N,要求编写程序求出最⻓连续因⼦的个数,并输出最⼩的连续因⼦序列。
1,如果只有⼀个因⼦,那么这个数只能为1或者质数。因此我们主要去计算两个及以上因数的情况。
2,在有两个及以上的数连乘中,因数的最⼤上限为sqrt(N),即N的平⽅根。
3,因此思路就是,不断构造连乘,看连乘的积是否是N的因数,如果是,则看这部分连乘的数的个数是否⽐已记录
的多。
4,⽤变量first记录连乘的第⼀个数字,这⾥我把它赋初值为0,如果在寻找N的因数过程中,first没有改变,那么就表明N是1或者是⼀个质数

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
    int N;
    cin>>N;
    int n = sqrt(N);
    int max_size = 0, first = 0;
    for(int i=2; i<=n; i++){
        int j, temp=1;
        for(j=i; j<=n; j++){
            temp *= j;
            if(N%temp!=0) break; //不断构造连乘,看连乘的积是否是N的因数
        }
        if(j-i>max_size){
            max_size = j-i;
            first = i;
        }
    }
    if(first==0) cout<<1<<endl<<N;//first没有改变,那么就表明N是1或者是⼀个质数
    else{
        cout<<max_size<<endl;
        for(int i=0; i<max_size; i++){
            printf("%d%s", first+i, i==max_size-1?"\n":"*");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值