PAT甲级备考——逻辑题
题目
【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":"*");
}
}
}