重庆NKOJ2404-【语法基础】分解质因数
问题描述:
给出n个整数,请分解出它们的质因数。
输入格式:
第一行,一个整数n(n<=10000)
接下来n行,每行一个整数k(k<=2000,000,000,)
输出格式:
n行,每行代表一个整数的质因数,数字间以空格做间隔,按由小到大排列
样例输入:
3
100
1235
123456
样例输出:
2 5
5 13 19
2 3 643
题目分析:
这道题看上去不难,但是时间很少,优化时间的方法很值得一讲。
拿到题,相信大多数人都是这么写的:
#include<bits/stdc++.h>
using namespace std;
bool isprime(long long int num){num = abs(num);if(num == 2){return true;}if(num%2 == 0 || num<2){return false;}else{for(long long int i = 3; i*i <= num; i +=2){if(num%i == 0){return false;}}return true;}
}
int main ()
{int n,k;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&k);for(int j = 2; j <= k; j++){if(k%j == 0){if(isprime(j)){printf("%d ",j);}}}printf("\n");}return 0;
}
前面是祖传判断质数函数,后面是主程序(啊~废话)
然而结果……
这时候,有大聪明就说了:
“质数都是奇数(2除外),所以我们只需要给2一个特判,在循环那里改为int j = 3; j <= k; j += 2不就行了?”
修改后代码:
#include<bits/stdc++.h>
using namespace std;
bool isprime(long long int num){num = abs(num);if(num == 2){return true;}if(num%2 == 0 || num<2){return false;}else{for(int i = 3; i*i <= num; i +=2){if(num%i == 0){return false;}}return true;}
}
int main ()
{int n,k;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&k);if(k%2 == 0){printf("2 ");}for(int j = 3; j <= k; j += 2){if(k%j == 0){if(isprime(j)){printf("%d ",j);}}}printf("\n");}return 0;
}
的却,这样要快一些,但不多……
除了空间加了4KB,其余还不如前面。
那怎么办呢?
举个例子:当输入2000000000(题目约定k的最大值)的时候,程序运行了很久,最终得出答案:2 5.
那么对应的优化方案就是找到一个因数后,不停地除以该因数,直到除不尽为止。
AC代码:
#include<bits/stdc++.h>
using namespace std;
bool isprime(long long int num){num = abs(num);if(num == 2){return true;}if(num%2 == 0 || num<2){return false;}else{for(long long int i = 3; i*i <= num; i +=2){if(num%i == 0){return false;}}return true;}
}
int main ()
{int n,k;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&k);if(k%2 == 0){printf("2 ");}for(int j = 3; j <= k; j += 2){if(k%j == 0){if(isprime(j)){printf("%d ",j);}//不停地除while(k%j == 0){k /= j; }}}printf("\n");}return 0;
}
这道题确实有意思,值得认真思考。
重庆NKOJ2404-【语法基础】分解质因数相关推荐
- 重庆NKOJ1720-【语法基础】孪生素数
问题描述 如果n和n+2都是素数,称它们是孪生素数. 输入整数m,输出两个均不超过m的最大孪生素数.5<=m<=10000 输入格式: 一个整数m 输出格式: 两个空格间隔的整数,表示m以 ...
- 蓝桥杯 基础练习 分解质因数 python语言
蓝桥杯 基础练习 分解质因数 python语言 描述 求出区间[a,b]中所有整数的质因数分解. 输入 输入描述: 输入两个整数a,b. 输入样例: 3 10 输出 输出描述: 每行输出一个数的分解, ...
- 蓝桥杯 基础练习 分解质因数 C语言
蓝桥杯 基础练习 分解质因数 C语言 描述 求出区间[a,b]中所有整数的质因数分解. 输入 输入描述: 输入两个整数a,b. 输入样例: 3 10 输出 输出描述: 每行输出一个数的分解,形如k=a ...
- [蓝桥杯][基础练习VIP]分解质因数
题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 2< =a< =b< =10000 输入 输入两个整数a,b. 输出 每行输 ...
- java isprime函数_翁恺老师零基础java课程函数章第一题分解质因数
分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在 ...
- Java基础编程之分解质因数
问题分析: 1. 所谓分解质因数就是每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数.如30=2×3×5 .分解质因数只针对合 ...
- Java实现 蓝桥杯VIP 基础练习 分解质因数
题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...
- c语言用质因数分解法求最大公约数,分解质因数法求最大公约数(javascrip实现)
//判断是否为质数------------------------------------------------------ function isPrime(n) { for (var i = n ...
- 华清远见重庆中心--后端基础阶段技术总结/个人总结
目录 目录 目录 Java基础知识 java概述 JDK安装 JDK卸载 JDK版本切换 认识JetBrains 安装IDEA IDEA环境的认识 新建一个Java的项目 新建一个文件 第一个Java ...
最新文章
- Pandas 中的 concat 函数
- Verilog有符号数运算
- 实时全局光照!SVOGI in CryENGINE
- 概率假设密度滤波 matlab,高斯混合概率假设密度滤波器
- java 81 08,Java更多的库谜题81:烧焦到无法识别
- (十一)进阶算法之“搜索排序”
- 在存储器的层次结构里,谁最快,谁最贵,谁最大?
- Facebook也大干新闻聚合 “新闻快读”向所有媒体开放
- shell脚本--批量测试主机连通性ping IP
- php myflow,WordPress安装使用Flowplayer简易指南
- Zabbix 监控 MySQL
- Phome开发历程分享——Enjoy the Beginning
- DingTalk机器人C#代码
- MikroTik ROS软路由OSPF命令配置实例
- 【渝粤题库】陕西师范大学180213《消费经济学》作业 (高起本)
- C语言--三次方程数值求解
- 形式语言与自动机第二课
- K线形态识别—双K线之卖出型双日K线组合
- python人工智能面试题爱奇艺面试题_经典算法题:爱奇艺研发工程师算法笔试题...
- Unity 之 实用技巧更换编辑器主题
热门文章
- html引入babel-polyfill,babel-polyfill
- html --- 首字母放大缩小
- Linux hwclock命令参数及用法详解--Linux显示/设置硬件时钟命令
- 机器学习:让机器学会打游戏之陨石坠落
- 京东iphone8的异步加载爬取评论
- 《万岁,高三2班》剧照及剧组采访文章
- 高手在交易中总结的期货
- vue 导出excel,支持单元格合并,背景色,列宽,字体大小等
- java计算机毕业设计河南省农村多元化养老服务管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
- Real_time实时语义分割网络 SegNet, ENet, ICNet, BiSeNet,ShelfNet