pta_l1-6(连续因子)

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805138600869888

题意:给定n,求n的最长的连续子因子的长度,且输出最小的序列。

思路:我最开始就是暴力搜的,搜到最长的存下来即可,但忽略了我找的因子的乘积可能大于n,后来也没想到什么好的办法,然后参考了别人的题解。首先给出12!=479001600<231<13!=6227020800,这个要记住,从这可以看出n最长的连续子因子长度不会超过12,知道这个之后就可以从长度等于12开始,第二层循环表示序列的起始数字,搜到的第一个结果即最长的序列,且最小。要注意的是质数和因子全部相邻的数是有区别的,质数的最小序列就是本身,而后者比如105=3×5×7,最小序列是3。

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 LL n,suc,bg,len;
 6
 7 int main(){
 8     scanf("%lld",&n);
 9     for(LL i=12;i>=1;--i){
10         for(LL j=2;j<=sqrt(n);++j){
11             LL mul=1;
12             for(LL k=j;k<i+j;++k){
13                 mul*=k;
14                 if(mul>n) break;
15             }
16             if(mul>n) break;
17             if(n%mul==0){
18                 suc=1;
19                 bg=j;
20                 len=i;
21             }
22             if(suc) break;
23         }
24         if(suc) break;
25     }
26     if(suc){
27         printf("%lld\n",len);
28         for(LL i=bg;i<bg+len;++i){
29             printf("%lld",i);
30             if(i!=bg+len-1) printf("*");
31         }
32         printf("\n");
33     }
34     else{
35         printf("1\n%lld\n",n);
36     }
37     return 0;
38 }

原文地址:https://www.cnblogs.com/FrankChen831X/p/10518322.html

时间: 2024-10-04 02:03:37

pta_l1-6(连续因子)的相关文章

CCCC 连续因子

题意: 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入格式: 输入在一行中给出一个正整数N(1<N<231). 输出格式: 首先在第1行输出最长连续因子的个数:然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内. 分析:暴力. #include<bits/stdc++.h&g

L1-6 连续因子 (新的开始

一个正整数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 解题思路

连续因子

题目: 思路:连续因子的范围一定是从1到sqrt(N),因为如果有一个数超过sqrt(N)了,那么无论它与前一个数还是后一个数相乘都会大于N.所以在1到sqrt(N)中暴力找出能被N整除的连续相乘的数串即可.如果N是质数,要另作考虑,输出的结果就是1和N. 上代码: import java.util.*; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub

L1-006 连续因子 (20 分) 模拟

一个正整数 N 的因子中可能存在若干连续的数字.例如 630 可以分解为 3×5×6×7,其中 5.6.7 就是 3 个连续的数字.给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入格式: 输入在一行中给出一个正整数 N(1). 输出格式: 首先在第 1 行输出最长连续因子的个数:然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内. 输入样例: 630 输出样例: 3 5*6*7 #incl

L1-006 连续因子 (20分)

题意分析 题目中已经将意思说的很清楚了,就是输出一个数的最长连续因子的个数,并且输出是哪几个因子相乘.可以将题目从这两个角度进行分析: N为素数时,最长连续因子的个数为1,即它自己. N不为素数时,即N为合数时,暴力模拟即可,将连续的数进行累积,直到累积后的结果不能被N整除为止,这样就能够不断更新最长连续因子的个数,预保留第一个数,就可以在最终输出是能够直接输出这几个连续因子. AC代码 #include<iostream> #include<cstdio> #include<

L1-006. 连续因子

#include <iostream>using namespace std;#include <cmath>int main(){ int n, t, i, j; int num; int s; cin >> n; t = n; num = 0, s = 0; for (i = 2; i <= sqrt(n) + 1; i++) if (n%i == 0) {  t = n / i;  for (j = i + 1; j <= sqrt(n) + 1; j

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打印就行了,但这题话说wrong好几次啊,坑点是沙漏符号后面不打印空格,orz... <span style="font-size:14px;">#include<iostream> #include<stdio.h> #include<math.h

逆袭指数---杭电校赛(暴力搜索)

Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据. 当这些都失败以后,小明转向了数学研究,希望从中得到一些信息.一天,小明在研究<BestCoder逆袭的数理基础>这本书时,发现了宝贵的信息,其中写道:  每个人都存在一个逆袭指数,对于这个逆袭指数,可能存在连续的因子,如果这个连续因子足够长的话,那么这个人逆袭的概率就很大! 小明已知自己的逆

逆袭指数-——杭电校赛(dfs)

逆袭指数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 626    Accepted Submission(s): 94 Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据. 当这些都