质因数

质因数分解的rho以及miller-rabin

為{幸葍}努か 提交于 2020-04-04 06:10:55
一、前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题。我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法,rho启发式搜索质因数分解算法等。在此文里,我要介绍的就是miller-rabin算法以及rho启发式搜索分解算法。 二、算术基本定理 首先,我们得知道,任意一个大于1的自然数都可以分解为有限个质数的乘积。这里因子均为质数,且为正整数。我们把这样的分解成为N的标准分解式。关于算数基本定理的应用有许多,例如可以证明素数无限,定义god,lcm等,在此不一一赘述。有了算数基本定理,我们可以发现计算数论函数,约数和等都是十分方便的,这大大的方便了我们的解题。接下来我们介绍如何来分解质因数。 三、质因数分解的算法 所谓质因数,是某自然数的因素而且这个因素还得是质数。 我们不难想到基本的枚举,即暴力枚举1~n所有数,判断是否能够被n整除且该数是否为质数。大概代码如下: For i:=1 to n do If n mod i=0 then If check(i) then //check为检验i是否为质数的子函数,返回值为boolean Writeln(i); Function check(n:longint):boolean; Var i:longint; begin For i:=2 to n

[C++]蓝桥杯 ADV-181. 质因数2

爷,独闯天下 提交于 2020-03-17 01:16:23
将一个正整数N(1<N<32768)分解质因数,把质因数按从小到大的顺序输出。最后输出质因数的个数。 输入格式   一行,一个正整数 输出格式   两行,第一行为用空格分开的质因数   第二行为质因数的个数 样例输入 66 样例输出 2 3 113 样例输入 90 样例输出 2 3 3 5 4 样例输入 37 样例输出 37 1 # include <iostream> using namespace std ; int main ( ) { int n , cnt = 0 ; cin >> n ; //cout<<n<<"="; for ( int i = 2 ; i <= n ; i ++ ) { while ( n % i == 0 ) { cout << i ; cnt ++ ; n = n / i ; if ( i <= n ) cout << " " ; } } cout << endl << cnt ; return 0 ; } 来源: CSDN 作者: 明月寄天涯 链接: https://blog.csdn.net/qq_43356428/article/details/104901591

质因数的个数

谁说胖子不能爱 提交于 2020-02-05 02:43:39
题目链接: https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9?tpId=40&tqId=21338&tPage=1&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking 题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 示例1 输入 120 输出 5 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(cin>>n){ 9 int sum=0; 10 for(int i=2;i<=sqrt(n);i++){ 11 while(n%i==0){ 12 sum++; 13 n/=i; 14 } 15 } 16 if(n>1) cout<<sum+1<<endl; 17 else cout<<sum<<endl; 18 } 19 return 0;

质因数的个数 (分解质因数)

妖精的绣舞 提交于 2020-02-05 02:43:11
链接: https://www.nowcoder.com/questionTerminal/20426b85f7fc4ba8b0844cc04807fbd9?f=discussion 来源:牛客网 [编程题]质因数的个数 热度指数:20444 时间限制:1秒 空间限制:65536K 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 示例1 输入 120 输出 5 思路 1)题目需要多组测试用例,我的第一个想法是没能每个测试用例都去判断质数,所以可以使用打表法,把100000以内的质数标记出来 2)因为c++中的数组不能太大(同时也是考虑到题目有内存要求),标记的质数表不能全部包含所有可能的输入数据的质因数,这里就有一个小技巧:如果输入的数据n最后剩余不为1,则表示还存在一个大于质数表内的质数 1 #include<iostream> 2 #include<string> 3 #include<cmath> 4 #include<algorithm> 5 6 using namespace std; 7 8 bool mark[10000]; 9 int prime[10000];

质因数的个数

末鹿安然 提交于 2020-02-05 02:42:21
题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2 2 2 3 5, 共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 分析: 1.一个数a的质因数肯定小于sqrt(a),否则两个大于sqrt(a)的书相乘肯定大于a; 2.从2开始试探是否可以整除,如果可以则计数器count++;在这里要注意的是 我们并不用判断i是否是质数,因为它肯定是一个质数。因为我们是从2开始 试探的,假设出现一个i不是质数,其实在i之前肯定该i肯定被小的质数分解了 如果最后n是一个无法分解的大于1(1不是质数)的质数,count++; #include <iostream> using namespace std; int main(){ long N; while(cin >> N){ int count = 0; for(int i = 2; i * i < N; i++){ while(N % i == 0){ count++; N /= i; } } if(N >= 2) count++; cout << count << endl; } return 0; } 来源: https://www.cnblogs.com/zhuobo/p/10199932

清华复试机试之质因数个数

﹥>﹥吖頭↗ 提交于 2020-02-04 07:03:56
题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 示例1 输入 120 输出 5 分析:可以在上一题的基础之上,利用其素数筛选法进行修改,只需要将输入的n每次从prime(素数数组)中取余,如果余数为0则说明是n的一个质因数,将n/prim[i],count++ 然后并将i指针重新指向prime的起始下标(比如说这里的120=2*2*2*3*5,2就会出现多次),余数不为零说明不是质因数,则i++后移,需要注意的一点是,最后循环结束后可能会出现此时n还不是1的情况,此时要再设置一个if(n>1) count++ 表示还存在一个质因数 附上牛客OJ本题网址 https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9?tpId=60&tqId=29479&tPage=1&ru=/kaoyan/retest/1001&qru=/ta/tsing-kaoyan/question-ranking #include<iostream> #include<cstdio> #include<stack>

质因数分解(蓝桥杯)

和自甴很熟 提交于 2020-01-31 04:03:16
质因数分解(蓝桥杯)   机械类萌新第一次发稿,最近在刷蓝桥杯的练习题。 题目 问题描述   求出区间[a,b]中所有整数的质因数分解。 输入格式   输入两个整数a,b。 输出格式   每行输出一个数的分解,形如k=a1 a2 a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 样例输入 3 10 样例输出 3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5 代码 # include <stdio.h> int main ( ) { int fun1 ( int m ) ; int fun2 ( int n ) ; int a , b , t = 1 , u = 1 , i ; scanf ( "%d%d" , & a , & b ) ; for ( i = a ; i <= b ; i ++ ) { if ( fun1 ( i ) == 0 ) printf ( "%d=%d\n" , i , i ) ; u = i ; t = 1 ; if ( fun1 ( i ) == 1 ) { printf ( "%d=" , i ) ; while ( 1 ) { t = t * fun2 ( u ) ; printf ( "%d" , fun2 ( u ) ) ; if ( t != i ) printf ( "*" ) ;

质因数分解函数

人走茶凉 提交于 2020-01-27 01:20:49
编写函数void func(unsinged int n),实现计算并输出一个正整数的质因数分解式。例如:n为90时,输出90=2*3*3*5。 ①是素数就输出: 可能直接想着先要做个判断了,如果是素数判断结束,输出这个素数。如果不是,在进入下面的分解的步骤吧。 但是,有没有人想过素数的定义是什么?素数是一类只能被1或自身整除的数字对吧?如果去掉之前的这个判断,直接在接下来的分解步骤中去判断会怎样? 假如输入了“11”,“11”是个素数,只能被1和11整除。那么,设置除数从2开始,是不是从2到10为止都没法整除呢?等到了11,11除以11刚好是1,这时候输出11。是不是和上面的判断的结果一样呢? ②、输出质因数的分解式,除数是素数: 在这里可能会有人会疑惑了,如果只用素数整除,是不是应该写个函数去输出素数呢?从2开始,3、5、7、11这样的去循环输出着素数。假如除不尽2就换3,以此类推。 如果真的这样去想,源码不仅会写的特别繁杂不说,还要经过反反复复的调试。那么,有没有更简单的方法呢? 假如,输入一个数字24。24可以分解成3X8或者4X6对吧?但是我们按照①的想法走,第一个除数是2,那么3X8就直接出局了。可能有人会想,24除2得到12,2加1是3,12除以3是4,3再加1是4,除数中有非素数了,不对啊!!!!!!况且4还能拆分成两个2啊?! 那么,可以在除以2的时候做个判断啊

质因数的个数

自古美人都是妖i 提交于 2020-01-18 20:30:11
题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2 2 2 3 5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数据,输出N的质因数的个数。 示例1 输入 120 输出 5 题目个人解析:首先了解质数,质数是除了1和它本身之外,没有别的因数。求法与约数的个数类似。一个数的两个约数,其中一个一定在sqrt(number)内,所以循环时,可以减少时间复杂度。(非质数一定可以用质数表示出来),每次循环时,遇到可以除的质数时,循环除到除不了,换下一个数继续循环。 代码示例: # include <iostream> # include <stdio.h> # include <string.h> # include <vector> # include <map> using namespace std ; //质因数的个数 int countfactor ( int number ) { int count = 0 ; for ( int i = 2 ; i * i <= number ; i ++ ) { while ( number % i == 0 ) { count ++ ; number = number / i ; } } if ( number != 1

1098:质因数分解

不打扰是莪最后的温柔 提交于 2019-12-15 21:43:22
1098:质因数分解 【题目描述】 已知正整数nn是两个不同的质数的乘积,试求出较大的那个质数。 【输入】 输入只有一行,包含一个正整数 nn。 对于60%的数据,6≤n≤10006≤n≤1000。 对于100%的数据,6≤n≤2×1096≤n≤2×109。 【输出】 输出只有一行,包含一个正整数 pp,即较大的那个质数。 【输入样例】 21 【输出样例】 7 代码 # include <bits/stdc++.h> using namespace std ; bool isprime ( int n ) { if ( n == 2 ) return true ; for ( int i = 3 ; i * i <= n ; i ++ ) if ( n % i == 0 ) return false ; return true ; } int main ( ) { int n ; cin >> n ; if ( n % 2 == 0 && isprime ( n / 2 ) ) cout << n / 2 ; for ( int i = 3 ; i * i <= n ; i ++ ) { if ( n % i == 0 && isprime ( n / i ) ) { cout << n / i ; break ; } } return 0 ; } 来源: CSDN 作者: