#10198. 「一本通 6.2 练习 1」质因数分解

版权声明:有女朋友的老江的博客,转载请告知老江 https://blog.csdn.net/qq_42367531/article/details/83443755

loj的题目   caioj的题目 两个都可以上传啊

[题目描述] 原题来自: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就是最大的 
	*/
    }
}

千万不要感到惊讶,因为我也很惊讶, QAQ

猜你喜欢

转载自blog.csdn.net/qq_42367531/article/details/83443755