重庆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 ...
最新文章
- [原创]软件测试思维方式
- linux使用freetds 连接连远程服务器sqlservser2012
- 年龄测试计算器软件,抖音很火的年龄计算器
- linux命令查找行数命令,Linux中用grep命令来搜索单词及统计匹配的行数
- 专访阿里巴巴量子实验室:最强量子电路模拟器“太章”到底强在哪?
- UIKit框架-高级控件Swift版本: 6.UIAlertView方法/属性详解
- .net调用c++方法时如何释放c++中分配的内存_C/C++常见面试题总结
- 设计模式(十)外观模式
- taptap领取礼包显示服务器繁忙,原神taptap预约奖励领取教程 taptap预约奖励怎么领取...
- 怎么用计算机录制mp3的音频,电脑怎么录音,电脑录制音频的方法
- 单元测试测试用例覆盖率为0
- sata port multiplier
- 呸!都TM开始打广告了,垃圾!
- 什么是水仙花数并判断水仙花数
- 满江红--大宋提刑官
- STM32F103 PB3 作为 普通IO使用
- simm计算机英语,SIMM
- 最近有两个请了专业团队做地推
- 计蒜客一月入门赛:《三个火枪手》题解
- 浏览器调用本地应用程序
热门文章
- P2264 情书 Trie匹配
- 数据分析领域,为什么要对比Excel学习Python?
- 企业标准工时是什么意思?如何制定企业标准工时
- idea设置jdk8的版本
- 人生在世,不作为是不对的。!
- 小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
- easyui java代码生成器,easyui+jdbc+xml模板开发自动化生成报表的java工具 - 贪吃蛇学院-专业IT技术平台...
- 制作ubuntu 18.04启动盘并安装系统+必要配置
- sql 查询相互关注的人
- 学习计算机需要要了解与掌握的计算机基础