目录
1.找出n以内的质数——埃筛
解题思路:标记出合数,像筛子一样筛选出质数。
步骤:
第一步,数组初始化为0;
第二步,使用双重循环,标记出合数;
第三步,在主函数中,输出未被标记的,就是质数。
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
void primes(int x)
{
//第一步
for(int i=0;i<=x;i++) a[i]=0;
//第二步
for(int i=2;i<x;i++)
{
if(a[i]==0)//i是质数
{
for(int j=2;i*j<=x;j++)//筛选出合数,标记为1
a[i*j]=1;
}
}
}
int main(){
int n;
cin>>n;
primes(n);
//第三步
for(int i=2;i<=n;i++)
{
if(a[i]==0) cout<<i<<endl;
}
}
2.分解质因数
12=2*2*3,每一个数分解成质因数的算式是唯一的。
解题思路:每一个数分解成质因数的算式是唯一的。从2开始找质因数,例如12先找到2,则12/2/2=3,除掉2这个因数后,后面就不会出现2的合数作为因数了,保证了找到的因数是质数。
步骤:
第一步,从2开始找因数,找到就存放在数组中;
第二步,除掉这个因数,知道n中不再包含这个因数,并统计该因数的个数;
第三步,对于只有1和他本身的质数分解,需要单独存放。
void divide(int n)//分解质因数
{
int m=0;
//第一步
for(int i=2;i<=sqrt(n);i++)//从2开始拆分
{if(n%i==0){// 如果n能被i整除,说明可以拆分
a[++m]=i;//++m先加再用,从a[1]开始保存,a数组表示存放的因数
b[m]=0;//b数组表示因数的个数
//第二步
while(n%i==0){//一直可以整除的时候,全部除掉这个因数(比如2)
b[m]++;//这个因数的个数累加
n=n/i;//每次除掉一个因数(比如2),原来的数值除掉这个因数。 比如12在这个循环后,剩下12/2/2=3
}
}
}
//第三步
if(n>1){//对于质数,分解为本身和1,在这里进行判断
a[++m]=n;//先加后用,
b[m]=1;
}
}
3.分解成对约数
100的约数:1 100, 2 50, 4 50, 5 20, 10 10(成对输出所有的约数)
注意事项:
1)成对出现的约数,只需查找到n的开方根位置;
2)成对出现的约数,当找到其中一个约数i时,接着保存另外一个约数n/i。
3)相同的约数,只保存一个。例如100的约数10,只保存1个10。
void factor(int n)
{
for(int i=1;i<=sqrt(n);i++)//注意从1开始,结束值是开方
{
if(n%i==0) {
f[++m]=i;//++m先加后用,f[1] 开始保存,反正上下保存一致,第一个保存第一个约数
if(i!=n/i) f[++m]=n/i;//++m保存到下一个格子 ,下一个格子保存第二个约数
}//通过这个判断,可以将分解的因数按顺序放到数组中
}
}//可以将函数设置为 int类型,需要返回int类型的数,可以把m数值返回。