信息学奥赛一本通C++语言——1098:质因数分解

【题目描述】
已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。

【输入】
输入只有一行,包含一个正整数 n。

对于60%的数据,6≤n≤1000。

对于100%的数据,6≤n≤2×109。

【输出】
输出只有一行,包含一个正整数 p,即较大的那个质数。

【输入样例】
21
【输出样例】
7
方法一:n的因数一定是质数

//只要找到最小的余数为0的因数即可 ,那么另一个因数就是最大的 
#include<cstdio>
int main(){
	int n;
	scanf("%d",&n);
	for(int i=2;i<=n;i++) {	
		if(n%i==0){
			printf("%d",n/i);
			break;	
		}
	}
return 0;
}

方法二:增加因数是否是质数的判断,

#include<cstdio>
//#include<cmath>
bool ispri(int n); 

int main(){
	int n,a,b;
	scanf("%d",&n);
	for(a=2;a<=n;a++) {	
		if(ispri(a)&&(n%a==0)){//a是质数,并且余数为0 
			b=n/a;
			if(!ispri(b)){
				printf("输入n不符合题意");//题意要求n的两个因数都是质数 
				break;
			}else{
				printf("%d",b);
				break;
			}	
		}
	}
return 0;
}

bool ispri(int m){
	for(int i=2;i<m;i++){
		if(m%i==0){
			return false;//说明a不是质数。 
		}
	}
	return true;
}
//题目已知n是两个质数的积,不用再判断除数是否是质数,只要找到最小的余数为0的除数即可 ,那么另一个除数就是最大的 
/*
#include<cstdio>
int main(){
	int n;
	scanf("%d",&n);
	for(int i=2;i<=n;i++) {	
		if(n%i==0){
			printf("%d",n/i);
			break;	
		}
	}
return 0;
}
*/ 
#include<iostream>
#include<cmath>
using namespace std;
bool prime(int num);
int main(){
	int n;
	scanf("%d",&n);
	if(prime(n)){
		printf("%d is prime",n);
	}
		
	return 0;
}

/*判定 num 是否为质数(素数),质数总是等于6x-1或者6x+1,其中 x 是大于等于1的自然数。
bool prime(int num)
{
	if (num <= 3) {
        return num > 1;
    }
    // 不在6的倍数两侧的一定不是质数
    if (num % 6 != 1 && num % 6 != 5) {
        return false;
    }
    //在6的倍数两侧的不一定是质数,还需要进一步通过判定,例如55
    int sqr = (int)sqrt(num);
    for (int i = 5; i <= sqr; i += 6){
        if (num % i == 0 || num % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}
*/ 

/*判定 num 是否为质数(素数),反证法:假如 num 是合数,必然存在非 1 的两个约数p1和p2,其中p1<=sqrt(num),p2>=sqrt(num)
bool prime(int num)
{
	if(num <= 3) {
        return num > 1;//1既不是素数,也不是合数
    }
    int sqr=(int)sqrt(num);
    for(int i = 2; i<=sqr; i++){
        if (num%i==0){
            return false;
        }
    }
    return true;
}
*/

/*判定 num 是否为质数(素数) ,假如 num 是合数,必然存在非 1 的两个约数p1和p2,其中p1<=sqrt(num),p2>=sqrt(num)
bool prime(int num){
	if(num <= 3) {
        return num > 1;//1既不是素数,也不是合数
    }
	int sqr = (int)sqrt(num);
	int j=2;
	while( j<sqr && num%j!=0 ){
		j++;
	}
	if(num%j==0){
		return false;
	}else{
		return true;
	}
}
*/

发布了107 篇原创文章 · 获赞 32 · 访问量 3243

猜你喜欢

转载自blog.csdn.net/weixin_46272402/article/details/104648196