题目链接

题意 : 给你一个数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         else
39         {
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             else
44             {
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

 

posted on 2014-11-05 20:34  枫、  阅读(350)  评论(0编辑  收藏  举报