1 条题解

  • 0
    @ 2025-8-24 21:26:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar IOCTYCNconbill
    **

    搬运于2025-08-24 21:26:42,当前版本为作者最后更新于2018-08-06 22:44:46,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    ##//翻看了一下各位大犇的代码,好像没有和我一样的,鼓起勇气发一篇题解//代码有点短。

    这个题目求任意一个大于九的奇数等于三个质数的和,题目说明了第一个质数要最小,其次第二个,据此可以进行优化循环的次数。然后就是进入正题了 ,首先先要明白一件事,三个数相加为奇数,只有两种可能

    ①两个偶数加一个奇数.

    ②三个奇数.

    ①先判断前两个质数都是偶数的情况,因为偶数中只有2是素数,那么就只要判断这个(n-4)是否为素数,如果是,就直接输出2,2,n-4。

    ②如果这三个数都是质数,那么从i=3开始循环,并保证i为奇数并且i为素数,再在第二重循环里面让j=i并保证j为奇数且j为素数,最后只要判断(n-i-j)是否为奇数且为素数就行了,满足就输出答案。


    #include<bits/stdc++.h>
    using namespace std;
    int check(int x){
    	for (int i=2;i*i<=x;i++)
    	if(x%i==0) return 0;
    	return 1;
    }
    int main(){
    	int n;
    	cin>>n;
    	if(check(n-4)) {
    	cout<<"2 "<<"2 "<<n-4;
        return 0;
        }     //第一种情况
    	for (int i=3;i<n;i++)//第二种情况
    	if((i%2)!=0&&check(i))//优化
    	for (int j=i;j<n;j++)
    		if((j%2)!=0&&check(j))//优化
    		if(check(n-i-j)) {
    		cout<<i<<" "<<j<<" "<<n-i-j;return 0;//不用循环第三个数,优化。
            }
    	
    }
    
    • 1

    信息

    ID
    572
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者