【题目描述】
已知正整数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;
}
}
*/