版权声明:有女朋友的老江的博客,转载请告知老江 https://blog.csdn.net/qq_42367531/article/details/83443755
[题目描述] 原题来自:NOIP 2012 普及组
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
[输入格式]
输入只有一行,包含一个正整数 n。
[输出格式]
输出只有一行,包含一个正整数 p,即较大的那个质数。
[样例输入]
21
[样例输出]
7
[数据范围与提示]
对于 30%的数据,n≤1000
对于全部数据,6≤n≤2×10^9
思路:不得不承认,这道题我刚开始是真的想复杂了,然后在不断的调试之中,发现这道题真tmd简单,其实就是一个输入,一个循环,一个判断,就这么简单,可能会有很多人想到的是如果我们输入的是一个质数的话,肯定会输出质数本身。
这个想法是错误的,为什么呢?先看一下题目吧
已知正整数 nnn 是两个不同的质数的乘积,试求出较大的那个质数。
不难理解,两个不同的指数的乘积,那么请问质数本身是不是和1相乘的,那么1是质数吗?所以的话,所以的质数的输入,只会输出一个答案,就是1,因为他们根本判断不了,输入的时候就已经打破的协议
然后的话就很简单的,为什么呢?
因为我们既然已经想清楚了标题的话,那么就是说:只要这个数本身从2这个质数开始循环,只要n%i==0,就是成立的,而且第一个成立的就是最小的质因数,而且质因数是两两为一组,只要你知道了最小的,最大的不就是原数除以最小的吗?
我解释清楚了对吗?好的,那我就默认你们都懂了啊
上代码,代码我已经写的很清楚了啊
/*
题意一定要理解清楚
不然你调试一百年都调试不出来
已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数。
理解清楚两个不同的质数的乘积
也就是说这个数本身不能是质数,否则就只会输出1
*/
#include<cstdio>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n; scanf("%d",&n);
for(int i=2;i<=n;i++)
{
if(n%i==0)
{
printf("%d",n/i);
return 0;
}
/*
这个就是看数学基础了,如果清楚分解质因数的话,就会知道
质因数是两两一组的,所以只要从2这个质数开始循环判断的话
第一个mod=0的数,就是最大和最小质因数的那一组解
那么用要分解的数除以最小的质因数就是最大的质因数
比如说:21
21%2!=0,但是21%3=0,那么3就是21的一个质因数
然后21/3=7就是和3成为一组的质因数
因为3是最小的,所以7就是最大的
*/
}
}