首页 > 代码库 > URAL 1356. Something Easier(哥德巴赫猜想)

URAL 1356. Something Easier(哥德巴赫猜想)

题目链接

题意 : 给你一个数n,让你找出几个素数,使其相加为n,输出这些素数。

思路 :

哥德巴赫猜想 :

任何一个大于 6的偶数都可以表示成两个素数之和。

任何一个大于9的奇数都可以表示成三个素数之和。 

而在该题中,偶数中2本身就是个素数,奇数中小于9的都是素数,所以只要写一个判断素数的函数即可,这样不在范围内的数就可以直接判断输出了。

任何一个整数N(N>=2)最多由三个素数相加构成。要分情况考虑:

  1. 如果N为偶数,1)如果N==2,直接输出;

                        2)如果N>2,那么N一定可以写成两个素数的和;

  2.如果N为奇数,1)如果N自身就是素数,则直接输出;

                        2)如果N由两个素数构成,这两个素数只可能是:2 和 N-2;

                        3)N为三个素数之和。

 

 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4  5 using namespace std ; 6  7 bool prime(int n) 8 { 9     for(int i = 2 ; i * i <= n ; i++)10     {11         if(n % i == 0) return false ;12     }13     return true ;14 }15 int main()16 {17     int T,n ;18     scanf("%d",&T) ;19     while(T--)20     {21         scanf("%d",&n) ;22         if(n % 2 == 0)23         {24             if(n == 2)25                 printf("2\n") ;26         //    else if(n == 4) printf("2 2\n") ;27             else{28                 for(int i = 3 ; i <= n ; i += 2)29                 {30                     if(prime(i) && prime(n-i))31                     {32                         printf("%d %d\n",i,n-i) ;33                         break ;34                     }35                 }36             }37         }38         else39         {40             if(prime(n)) printf("%d\n",n) ;41             else if(prime(n-2)) printf("2 %d\n",n-2) ;42             //else if(prime(n-4)) printf("2 2 %d\n",n-4) ;43             else44             {45                     bool flag = false ;46                 for(int i = 3 ; i <= n ; i += 2)47                 {48                     for(int j = 3 ; j <= n ; j += 2)49                     {50                         if(prime(i) && prime(j) && prime(n-i-j))51                         {52                             printf("%d %d %d\n",i,j,n-i-j);53                             flag = true ;54                             break;55                         }56                     }57                     if(flag) break ;58                 }59             }60         }61     }62     return 0 ;63 }
View Code

 

URAL 1356. Something Easier(哥德巴赫猜想)