由于这道题目数据范围小,所以属于水题。可以采取暴力的做法来解决。

代码如下:

#include"bits/stdc++.h"
using namespace std;
const int maxn=;
bool tag[maxn+];
vector<int>v;int n;
bool judge(int m){
while(n%m==){
if(n==m){
printf("%d\n",m);
return true;
}
else printf("%d*",m);
n/=m;
}
return false;
}
int main(){
for(int i=;i<=maxn;i++){
if(!tag[i])v.push_back(i);
for(int j=i<<;j<=maxn;j+=i)
tag[j]=true;
}
while(~scanf("%d",&n)){
for(int i=;i<v.size();i++)
if(n%v[i]==&&judge(v[i]))
break;
}
return ;
}

但是如果把这题的数据范围加到1e8,那么用这种暴力的方法光是打一个素数表都很耗时。如何快速解决1e8的因式分解呢?可以这样想:

1e8以内的数大于1e4的质因子最多只能出现一次(因为1e4的平方等于1e8,所以如果出现一次以上就会超过1e8),而且如果这个数出现了大于1e4的质因子,那么当我们把小于1e4的质因子都除尽时,留下的就是这个大于1e4的质因子。所以我们打素数表时其实不用打到1e8,只要1e4就够了(如果范围是n就打到根号n),这样可以加速了1e4倍。

代码如下:

#include"bits/stdc++.h"
using namespace std;
const int maxn=1e4;
bool tag[maxn+];
vector<int>v;int n;
bool judge(int m){
while(n%m==){
if(n==m) return true;
else printf("%d*",m);
n/=m;
}
return false;
}
int main(){
for(int i=;i<=maxn;i++){
if(!tag[i])v.push_back(i);
for(int j=i<<;j<=maxn;j+=i)
tag[j]=true;
}
while(~scanf("%d",&n)){
for(int i=;i<v.size();i++)
if(n%v[i]==&&judge(v[i]))
break;
printf("%d\n",n);
}
return ;
}

对于这一题65535的范围maxn只要设为256就够了,其他基本没有改动

还有一种解决因式分解的方法,如果如果内存足够并且测试数据有很多组的情况下这种方式会比较优

代码如下:

#include"bits/stdc++.h"
using namespace std;
const int maxn=1e4;
const int maxm=1e8;
int tag[maxm+];
vector<int>v;int n;
int main(){
for(int i=;i<=maxn;i++){
if(!tag[i])v.push_back(i);
for(int j=i<<;j<=maxm;j+=i)
if(!tag[j])tag[j]=i;
}
while(~scanf("%d",&n)){
while(tag[n]){
printf("%d*",tag[n]);
n/=tag[n];
}
printf("%d\n",n);
}
return ;
}

HDU-1164-Eddy's research I(分解质因数)的更多相关文章

  1. hdu 1164:Eddy's research I(水题,数学题,筛法)

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. HDU 1164 Eddy's research I( 试除法 & 筛法改造试除法 分解整数 )

    链接:传送门 题意:给出一个整数 n ,输出整数 n 的分解成若干个素因子的方案 思路:经典的整数分解题目,这里采用试除法 和 用筛法改造后的试除法 对正整数 n 进行分解 方法一:试除法对正整数 n ...

  3. hdu 1164 Eddy's research I

    http://acm.hdu.edu.cn/showproblem.php?pid=1164 题意很简单,只是写代码的时候需要注意几个问题 一.筛选素数的时候记得用埃式筛选法,要是直接找可能会WA. ...

  4. HDU 1164 Eddy's research I

    题目链接 题意 : 给你一个数,让你用它的素数质因子表示出来. 思路 : 先打一下表,因为会有重复的质因子,所以从大到小开始找,并且找到一个之后不能就接着往下找,要再找一遍这个数. #include ...

  5. HDU 1164 Eddy&#39;s research I【素数筛选法】

    思路:将输入的这个数分成n个素数的相乘的结果,用一个数组存储起来.之后再输出就能够了 Eddy's research I Time Limit: 2000/1000 MS (Java/Others)  ...

  6. HDU 1165 Eddy's research II(给出递归公式,然后找规律)

    - Eddy's research II Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  7. HDOJ 1164 Eddy's research I(拆分成素数因子)

    Problem Description Eddy's interest is very extensive, recently he is interested in prime number. Ed ...

  8. HDU 4497 GCD and LCM (分解质因数)

    链接 :  http://acm.hdu.edu.cn/showproblem.php?pid=4497 假设G不是L的约数 就不可能找到三个数. L的全部素因子一定包括G的全部素因子 而且次方数 ...

  9. HDOJ 1164 Eddy's research I

    Problem Description Eddy's interest is very extensive, recently he is interested in prime number. Ed ...

  10. HDU 1165 Eddy's research II (找规律)

    题意:给定一个表达式,然后让你求表达式的值. 析:多写几个就会发现规律. 代码如下: #pragma comment(linker, "/STACK:1024000000,102400000 ...

随机推荐

  1. css3 flex布局详解

    原文链接: http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool https://www.cnblog ...

  2. Python笔记_第一篇_面向过程_第一部分_4.格式化输入和输出

    开始Python编程首先要学习两类最常用(经常出现和使用)输入和输出.学习编程最重要的状态就是“人机交互”,所以这两类函数显得尤其重要. 第一部分 格式化输入 1.1   函:input 语:inpu ...

  3. 常用DIV+CSS命名大全集合

    一.命名规则说明:   -   TOP 1).所有的命名最好都小写 2).属性的值一定要用双引号("")括起来,且一定要有值如class="divcss5",i ...

  4. php 使用redis队列简单实用

    简介:队列要遵守先进先出的原则 demo.php <?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); $arr = ...

  5. VMware下的Ubuntu16设置连接主机网络,设置主机下可以通过xshell访问 VMware下的Ubuntu

    NAT模式连接 1. 2. 3. 4. 5. 6.

  6. UINavigationbar跳转黑色

    bug效果:导航栏过渡出现黑色

  7. shell的集合运算

    用cat,sort,uniq命令实现文件行的交集 .并集.补集 交集 $F_1 \cap F_2 $ cat f1 f2 | sort | uniq -d 并集 $F_1 \cup F_2 $ cat ...

  8. Please select an empty folder to install Android Studio

    原因 当前安装的Android Studio的文件夹不是空的 解决 把路径改成一个空文件夹即可

  9. 吴裕雄--天生自然 PYTHON3开发学习:SMTP发送邮件

    import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] ) SMTP.sendmail(from_addr, ...

  10. java基本类型和包装类型

          int 是基本类型,直接存数值 Integer是类,产生对象时用一个引用指向这个对象 Java把内存划分成两种:一种是栈内存,另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变 ...