问题描述:

给出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-【语法基础】分解质因数相关推荐

  1. 重庆NKOJ1720-【语法基础】孪生素数

    问题描述 如果n和n+2都是素数,称它们是孪生素数. 输入整数m,输出两个均不超过m的最大孪生素数.5<=m<=10000 输入格式: 一个整数m 输出格式: 两个空格间隔的整数,表示m以 ...

  2. 蓝桥杯 基础练习 分解质因数 python语言

    蓝桥杯 基础练习 分解质因数 python语言 描述 求出区间[a,b]中所有整数的质因数分解. 输入 输入描述: 输入两个整数a,b. 输入样例: 3 10 输出 输出描述: 每行输出一个数的分解, ...

  3. 蓝桥杯 基础练习 分解质因数 C语言

    蓝桥杯 基础练习 分解质因数 C语言 描述 求出区间[a,b]中所有整数的质因数分解. 输入 输入描述: 输入两个整数a,b. 输入样例: 3 10 输出 输出描述: 每行输出一个数的分解,形如k=a ...

  4. [蓝桥杯][基础练习VIP]分解质因数

    题目描述 求出区间[a,b]中所有整数的质因数分解. 提示 先筛出所有素数,然后再分解. 数据规模和约定 2< =a< =b< =10000 输入 输入两个整数a,b. 输出 每行输 ...

  5. java isprime函数_翁恺老师零基础java课程函数章第一题分解质因数

    分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在 ...

  6. Java基础编程之分解质因数

    问题分析: 1. 所谓分解质因数就是每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数.如30=2×3×5 .分解质因数只针对合 ...

  7. Java实现 蓝桥杯VIP 基础练习 分解质因数

    题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...

  8. c语言用质因数分解法求最大公约数,分解质因数法求最大公约数(javascrip实现)

    //判断是否为质数------------------------------------------------------ function isPrime(n) { for (var i = n ...

  9. 华清远见重庆中心--后端基础阶段技术总结/个人总结

    目录 目录 目录 Java基础知识 java概述 JDK安装 JDK卸载 JDK版本切换 认识JetBrains 安装IDEA IDEA环境的认识 新建一个Java的项目 新建一个文件 第一个Java ...

最新文章

  1. [原创]软件测试思维方式
  2. linux使用freetds 连接连远程服务器sqlservser2012
  3. 年龄测试计算器软件,抖音很火的年龄计算器
  4. linux命令查找行数命令,Linux中用grep命令来搜索单词及统计匹配的行数
  5. 专访阿里巴巴量子实验室:最强量子电路模拟器“太章”到底强在哪?
  6. UIKit框架-高级控件Swift版本: 6.UIAlertView方法/属性详解
  7. .net调用c++方法时如何释放c++中分配的内存_C/C++常见面试题总结
  8. 设计模式(十)外观模式
  9. taptap领取礼包显示服务器繁忙,原神taptap预约奖励领取教程 taptap预约奖励怎么领取...
  10. 怎么用计算机录制mp3的音频,电脑怎么录音,电脑录制音频的方法
  11. 单元测试测试用例覆盖率为0
  12. sata port multiplier
  13. 呸!都TM开始打广告了,垃圾!
  14. 什么是水仙花数并判断水仙花数
  15. 满江红--大宋提刑官
  16. STM32F103 PB3 作为 普通IO使用
  17. simm计算机英语,SIMM
  18. 最近有两个请了专业团队做地推
  19. 计蒜客一月入门赛:《三个火枪手》题解
  20. 浏览器调用本地应用程序

热门文章

  1. P2264 情书 Trie匹配
  2. 数据分析领域,为什么要对比Excel学习Python?
  3. 企业标准工时是什么意思?如何制定企业标准工时
  4. idea设置jdk8的版本
  5. 人生在世,不作为是不对的。!
  6. 小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
  7. easyui java代码生成器,easyui+jdbc+xml模板开发自动化生成报表的java工具 - 贪吃蛇学院-专业IT技术平台...
  8. 制作ubuntu 18.04启动盘并安装系统+必要配置
  9. sql 查询相互关注的人
  10. 学习计算机需要要了解与掌握的计算机基础