求素数,求因数的方法

素数的定义是(自己总结):只能被1和自身整除的数。
注意:
1.最小的素数是2。
2.“1”既不是素数也不是合数。
3.素数不包括负数。

一般的求解素数的方法是:

#include<iostream>
#include<math.h>
using namespace std;

bool isPrime(int n)
{
	int tmp = sqrt(n);
	for(int i = 2; i <= tmp; i++)
		if(n % i == 0)//可以整除,证明i是n的因子
			return false;
	return true;
}
int main()
{
	int n;
	cin>>n;
	for(int i = 2; i <= n; i++)
		if(isPrime(i))
			cout<<i<<"  ";
	return 0;
} 

可以使用筛选法求解一定范围内的素数。
筛选法的基本思路是(自己总结)(假如求解1~N内的素数):
1.开辟一个长度为(N+1)的bool类型的数组,记作a,并且全部设置为true(下标0,1不用管,从2开始);
2.从2开始,if(a[i] == false)时,continue; if(a[i] == true)时, if(isPrime(i)),转向3, else,置false;
3.把符合2中条件的元素保留(a[i]依然保持true),并且把所有它的倍数(1,2,…)全部置false。
**注意:**筛选法一直要遍历到尾部!!(参见百度百科)
效率问题:有人说1000000以内的素数用普通法效率更高,以上筛选法效率高。没有实际测试过。

代码:

#include<iostream>
#include<math.h>
#include<malloc.h>
using namespace std;

bool isPrime(int n)
{
	int tmp = sqrt(n);
	for(int i = 2; i <= tmp; i++)
		if(n % i == 0)//可以整除,证明i是n的因子
			return false;
	return true;
}

void filterPrime(int n)
{
	bool *a = (bool *)malloc(sizeof(bool) * (n+1));
	for(int i = 2; i <= n; i++)
		a[i] = true;
		
	for(int i = 2; i <= n; i++)
	{
		if(a[i] == true)
		{
			if(isPrime(i))
			{
				for(int j = i+i; j <= n; j+=i)
					a[j] = false;
			}
			else
				a[i] = false;
		}
	}
	//显示
	for(int i = 2; i <= n; i++)
		if(a[i] == true)
			cout<<i<<' '; 
}
int main()
{
	int n;
	cin>>n;
	filterPrime(n);
	return 0;
} 

因数
因数的求解可以从素数中获得启发。
求解一个数的所有因数:

#include<iostream>
#include<malloc.h>
using namespace std;

void printFactor(int n)
{
	int i;
	for(i = 1; i * i < n; i++)
	{
		if(n % i == 0)
			cout<<i<<' '<<(n/i)<<endl;
	}
	if(i*i == n)
		cout<<i<<endl;
}

int main()
{
	int n;
	cin>>n;
//求n的所有因数
	printFactor(n);
	return 0;
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值