zoukankan      html  css  js  c++  java
  • 洛谷P1579 哥德巴赫猜想(升级版)

    时间限制 1.00s

    内存限制 125.00MB




    题目背景

    1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。

    这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。

    从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。



    题目描述

    现在请你编一个程序验证哥德巴赫猜想。

    先给出一个奇数\(n\),要求输出\(3\)个质数,这\(3\)个质数之和等于输入的奇数。



    输入格式

    仅有一行,包含一个正奇数\(n\),其中\(9<n<20000\)



    输出格式

    仅有一行,输出\(3\)个质数,这\(3\)个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。



    输入输出样例

    输入 #1 输出 #1
    2009 3 3 2003



    PZ's solution

    1.直接枚举三个数\(i,j,k\),得到\(i,j,k\)后,判断其是否为质数即可;

    2.优化枚举:\(n\)必为三个质数的和,则最坏情况为\(n=n/3+n/3+n/3\),故我们只需要循环\([2,n/3]\)即可

    当枚举出\(i,j\)时,可以直接通过计算得到\(k=n-i-j\),减少一层循环;

    2.优化判断素数:我们可将单次质数的筛选时间降低到\(O(\sqrt{x})\),因为\(x\)为合数,若存在两个数\(a,b\),使得\(a*b=x\)

    则最坏情况必为\(\sqrt{x} * \sqrt{x}= x\),故\(x\)必有一个因子在\([2 ,\sqrt{x}]\)范围内;



    P1579 C++.cpp

    #include<cstdio>
    //#include<stdio.h>
    int n;
    int Getprime(int x){
    	for(int i=2;i*i<=x;++i)
    		if(x%i==0) return 0;
    	return 1;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=2;i<=n/3;++i)
    		if(Getprime(i)==1) for(int j=i;j<=n/3;++j)
    		//让j从i开始循环,可以保证 i<=j 
    			if(Getprime(j)==1){
    				int k=n-i-j;
    				//因为必存在合法解,在i<=j的情况下
    				//必有 i<=j<=k,满足题意
    				if(Getprime(k)==1){
    					printf("%d %d %d",i,j,k);
    					return 0;
    				}
    			}	
    }
    



    P1579 Python.py

    import math;
    import sys;
    
    def Getprime(x):
        for s in range(2,int(math.sqrt(x)+1)):
        # 因为range函数 左闭右开,故可能取不到 sqrt(x),
        # 要使用 sqrt(x)+1 方便 让循环取到 sqrt(x)。
            if x%s==0:
                return 0;
        return 1;
    
    n=int(input());
    
    for i in range(2,n//3):
        if Getprime(i)==1:
            for j in range(i,n//3):
                if Getprime(j)==1:
                    k=n-i-j;
                    if Getprime(k)==1:
                        print("%d %d %d"%(i,j,k));
                        sys.exit();
    
  • 相关阅读:
    子页面向父页面传值
    UEditor的使用方法
    MVC 生成PDf表格并插入图片
    简单行列转换记录
    此数据库没有有效所有者“的解决,我很受用
    ASP.NET MVC3 使用kindeditor编辑器获取不到值
    c#读写文件
    VB 中Sub和Function的区别
    问题集
    hadoop2.7.2运行例子时报错
  • 原文地址:https://www.cnblogs.com/Potrem/p/LuoguP1579.html
Copyright © 2011-2022 走看看