NOI的1.5.43质因数分解

总时间限制: 1000ms 内存限制: 65536kB
描述
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。

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

对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*10^9
输出
输出只有一行,包含一个正整数 p,即较大的那个质数。
样例输入
21
样例输出
7

分析题目:

  1. 因为该正整数是两个不同的质数的乘积,由此可知该正整数只有两组数相乘可得到,一组为1和其本身,另一组则是这两个不同的质数(也就是可以不用分析n%i==0中的i是否为质数
  2. 由题意可知:对于60%的数据,6 ≤ n ≤ 1000。对于100%的数据,6 ≤ n ≤ 2*10^9
    也就是数的范围比较大,又因为该题目有时间的限制。所有循环不能从1到2*10^9,否则就会超时,要用break,当所要求的质数将其较小的得到了,就可以得到另一个较大的数了,则循环可以终止。
  3. 附言:解法一为通过答案且不超时;解法二也是通过答案只是由于考虑了数是否为质数,解法三超时由于循环是从1到2*10^9且没有用break,则会超时;但是以上解法除去时间限制问题都为正确答案,但是解法三只适用于小范围,不适用于大范围,否则消耗时间相对很大。

解法一:

import java.util.Scanner;

public class Main{
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int n=in.nextInt();
	int i,a;
	for(i=2;i<=Math.sqrt(n);i++) {
		if(n%i==0) {
			a=n/i;
			System.out.println(a);
			break;
			}
		}
	}
}

解法二:(如果判断数是否为质数)

public class Main {
public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	int n=in.nextInt();
	int i,j,pin,a;//pin表示n的开根值
	for(i=2;i<n;i++) {
		for(j=2;j<i;j++) {//判断i是否为质数
			if(i%j==0) {
				break;
			}
		}
		if(i==j) {
			if(n%i==0&&i<=Math.sqrt(n)){
				a=n/i;
					System.out.println(a);
				break;
			}
		}
	}
  }
}

解法三:(超时)

没有使用break,循环会从一直进行到2*10^9为止,导致超时

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
	Scanner in=new Scanner(System.in);
	int n=in.nextInt();
	int i,pin,a;//pin表示n的开根值
	for(i=2;i<n;i++) {
			if(n%i==0&&i<=Math.sqrt(n)){
				a=n/i;
					System.out.println(a);
			}
		}
	}
}
发布了56 篇原创文章 · 获赞 51 · 访问量 1321

猜你喜欢

转载自blog.csdn.net/weixin_45455503/article/details/104242145
今日推荐