查找质数、分解质因数、约数

目录

1.找出n以内的质数——埃筛

2.分解质因数

3.分解成对约数


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数值返回。 

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值