PTA L1-006 连续因子(详解)
前言:本期是关于pta题目:连续因子的详解,今天你c了吗?
题目:
一个正整数 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
代码实现:
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{int j = 0;for (j = 2; j <= sqrt(n); j++){if (n % j == 0){return 0;}}return 1;
}
int main()
{int n = 0;scanf("%d", &n);if (is_prime(n)){printf("1\n");printf("%d", n);}else{int i = 0;int str = 0;int len = 0;for (i = 2; i <= sqrt(n); i++){int ret = 1;int k = 0;for (k = i;ret*k<=n;k++){ret *= k;if (n % ret == 0 && k-i+1>len){str = i;len = k - i + 1;}}}printf("%d\n", len);for (i = str; i < str + len; i++){if (i == str + len - 1){printf("%d", i);}else{printf("%d*", i);}}}return 0;
}
代码解读:
part 1:判断n是否为素数
int n = 0;scanf("%d", &n);if (is_prime(n)){printf("1\n");printf("%d", n);}
读取一个整数n后,首先判断其是否为素数
若为素数:素数的因子只有1和它本身,由于题目要求1不算在因子行列,故而素数的因子个数为1
素数的因子是它本身
以下是判断是否为素数的函数:是素数return 1 不是素数return 0
注意:使用库函数sqrt 需要包含头文件: #include<math.h>
int is_prime(int n)
{int j = 0;for (j = 2; j <= sqrt(n); j++){if (n % j == 0){return 0;}}return 1;
}
part 2 :找到并记录连续因子序列
int i = 0;int str = 0;int len = 0;for (i = 2; i <= sqrt(n); i++){int ret = 1;int k = 0;for (k = i;ret*k<=n;k++){ret *= k;if (n % ret == 0 && k-i+1>len){str = i;len = k - i + 1;}}}
1. 循环出2~sqrt(n)之间的所有数字
一个整数的因子的所有可能性在2~sqrt(n)之间,题目告知1不算在因子行列
2. 每一个数字都要进行自己的累乘
从这个数字本身开始,分别乘以后面的数字:
每次乘以一个值,都要进行判断此时的累乘结果是否能被n整除,直至累乘的结果超过n本身
若是累乘结果能被n整除,说明当前由一些乘在一起的数字都是n的因子,
说明找到了一个连续的因子序列,此时需要记住这个连续因子序列的开头和长度
(知道开头和长度就可以知道这个序列的起始和末尾)
定义str来记住当前连续因子序列的开头 ,定义len记录当前连续因子序列的长度
注意:记录下当前连续因子序列后,此时当前数字从自己开始的累乘已经结束了,下一次循环是另一个数字从自己开始的累乘的进行,又可能会找到存在于自它开始向后的数字中的连续因子序列
由于我们要寻找的是最长的因子序列,故而若是新的连续因子序列长度>原来的连续因子长度
就需要更新连续因子序列,故而判断并记录连续因子序列的代码如下:
if (n % ret == 0 && k-i+1>len){str = i;len = k - i + 1;}
part 3 :打印输出
printf("%d\n", len);for (i = str; i < str + len; i++){if (i == str + len - 1){printf("%d", i);}else{printf("%d*", i);}}
最后一个数字不需要*,其他位置的数字输出格式为:%d*
str:连续因子序列的开头
str+len-1:连续因子序列的末尾
PTA L1-006 连续因子(详解)相关推荐
- Talib技术因子详解(四)
talib安装方式:pip install Ta-lib Tushare数据获取请参考:金融量化分析基础环境搭建 数据获取代码请参考:Talib技术因子详解(一) 26.MACD 异同移动平均线,调用 ...
- Talib技术因子详解(三)
talib安装方式:pip install Ta-lib Tushare数据获取请参考:金融量化分析基础环境搭建 数据获取代码请参考:Talib技术因子详解(一) 17.ADX 平均趋向指数,调用方式 ...
- Talib技术因子详解(二)
talib安装方式:pip install Ta-lib Tushare数据获取请参考:金融量化分析基础环境搭建 数据获取代码请参考:Talib技术因子详解(一) 11.SAR 阶段中点价格SAR指标 ...
- L1、L2正则化详解
正则化是一种回归的形式,它将系数估计(coefficient estimate)朝零的方向进行约束.调整或缩小.也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险. 一. ...
- tikhonov正则化 matlab_4 L1和l2正则化详解(花书7.1 参数范数惩罚)
7.1 参数范数惩罚 许多正则化方法通过对目标函数 添加一个 参数范数惩罚 ,限制模型(如神经网络.线性回归和逻辑回归)的学习能力.将正则化后的目标函数记为: 其中 是权衡范数惩罚项 和标准目标函数 ...
- PTA L1-003 个位数统计(详解)
前言:本期是关于pta题目:个位数统计的详细解法,今天你c了吗? 题目: 给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1 ...
- CUP 三级缓存L1 L2 L3 cahe详解
一 三级缓存(L1.L2.L3)是什么? 以近代CPU的视角来说,三级缓存(包括L1一级缓存.L2二级缓存.L3三级缓存)都是集成在CPU内的缓存,它们的作用都是作为CPU与主内存之间的高速数据缓 ...
- PTA L1-002 打印沙漏(详解)
前言:本期是关于pta题目打印沙漏的具体解法,今天你c了吗? 题目: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ********* ...
- PTA第六章作业详解
- PTA 7-33 有理数加法(详解)
前言:本期是关于有理数加法的具体解法,今天你c了吗? 题目: 本题要求编写程序,计算两个有理数的和. 输入格式: 输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数, ...
最新文章
- python list 删除元素_Python的list循环遍历中,删除数据的正确方法
- VScode 乱装插件环境破坏踩坑自我反思总结
- iOS知识小集·NSNumber to NSString出错啦
- 一个就简单的数学题 NYOJ 330
- TCP/IP的二层负载
- node.js中对Event Loop事件循环的理解
- Redhat ssh服务登录慢
- 我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
- ssl初一组周六模拟赛【2018.3.24】
- 路径规划之 A* 算法
- python更改整列小时分钟_利用python对excel中一列的时间数据更改格式操作
- 捷克论坛 最新ip_巧说:论坛外链如何正确的建设发布『 不易删』
- win7系统无法连接蓝牙的强推方案
- A/Btest (A/B测试)的营销策略效果分析
- 微信网页/微信小程序内实现长按识别二维码
- 校园二手物品交易平台实现查询交易订单情况功能
- 这些车企在企业微信里,装上高速的“组织引擎”
- 基因结构注释软件PASA安装全纪录
- 外包三年准备跳槽了!
- 快消品企业如何逆境中求胜