URAL1356(数论)
2012-05-07 11:28
267 查看
题意:给一个整数N(2 ≤ N ≤ 109),求至少可以找到几个素数的相加和为N,并输出各个素数。
解题思路:这题用到了有名的哥德巴赫猜想:任一大于5的整数都可写成三个素数之和,任一大于2的偶数都可写成两个素数之和。从这个猜想中可以得到,任何一个整数N(N>=2)最多由三个素数相加构成。要分情况考虑:
1. 如果N为偶数,1)如果N==2,直接输出;
2)如果N>2,那么N一定可以写成两个素数的和;
2.如果N为奇数,1)如果N自身就是素数,则直接输出;
2)如果N由两个素数构成,这两个素数只可能是:2 和 N-2;
3)N为三个素数之和。
View Code
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 using namespace std;
5 int f(int n)//判断n为素数
6 {
7 int i;
8 for(i=2;i<=sqrt(1.0*n);i++)
9 if(n%i==0) return 0;
10 return 1;
11 }
12 int main()
13 {
14 int n,m,i,j;
15 scanf("%d",&m);
16 while(m--)
17 {
18 scanf("%d",&n);
19 if(n%2==0)
20 {
21 if(n==2) printf("2\n");
22 else if(n==4) printf("2 2\n"); //大于2的偶数可以为两个素数之和
23 else
24 {
25 for(i=3;i<n;i=i+2) //简化程序
26 if(f(i)&&f(n-i))
27 { printf("%d %d\n",i,n-i); break;}
28 }
29 }
30 else
31 {
32 if(f(n)) printf("%d\n",n); //自身为素数
33 else if(f(n-2)) printf("2 %d\n",n-2); //由两个素数之和组成
34 else if(f(n-4)) printf("2 2 %d\n",n-4); //由三个素数之和组成
35 else
36 {
37 for(i=3;i<n;i=i+2) //简化程序
38 {
39 if(f(i))
40 {
41 for(j=3;j<n;j=j+2)
42 if(f(j)&&f(n-i-j))
43 { printf("%d %d %d\n",i,j,n-i-j); break; }
44 }
45 break;
46 }
47 }
48 }
49 }
50 return 0;
51 }
解题思路:这题用到了有名的哥德巴赫猜想:任一大于5的整数都可写成三个素数之和,任一大于2的偶数都可写成两个素数之和。从这个猜想中可以得到,任何一个整数N(N>=2)最多由三个素数相加构成。要分情况考虑:
1. 如果N为偶数,1)如果N==2,直接输出;
2)如果N>2,那么N一定可以写成两个素数的和;
2.如果N为奇数,1)如果N自身就是素数,则直接输出;
2)如果N由两个素数构成,这两个素数只可能是:2 和 N-2;
3)N为三个素数之和。
View Code
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 using namespace std;
5 int f(int n)//判断n为素数
6 {
7 int i;
8 for(i=2;i<=sqrt(1.0*n);i++)
9 if(n%i==0) return 0;
10 return 1;
11 }
12 int main()
13 {
14 int n,m,i,j;
15 scanf("%d",&m);
16 while(m--)
17 {
18 scanf("%d",&n);
19 if(n%2==0)
20 {
21 if(n==2) printf("2\n");
22 else if(n==4) printf("2 2\n"); //大于2的偶数可以为两个素数之和
23 else
24 {
25 for(i=3;i<n;i=i+2) //简化程序
26 if(f(i)&&f(n-i))
27 { printf("%d %d\n",i,n-i); break;}
28 }
29 }
30 else
31 {
32 if(f(n)) printf("%d\n",n); //自身为素数
33 else if(f(n-2)) printf("2 %d\n",n-2); //由两个素数之和组成
34 else if(f(n-4)) printf("2 2 %d\n",n-4); //由三个素数之和组成
35 else
36 {
37 for(i=3;i<n;i=i+2) //简化程序
38 {
39 if(f(i))
40 {
41 for(j=3;j<n;j=j+2)
42 if(f(j)&&f(n-i-j))
43 { printf("%d %d %d\n",i,j,n-i-j); break; }
44 }
45 break;
46 }
47 }
48 }
49 }
50 return 0;
51 }
相关文章推荐
- ural 1356. Something Easier(数论,哥德巴赫猜想)
- 数论 ural 1356. Something Easier
- Ural1049 基础数论
- 【数论】ural1091
- URAL 1355. Bald Spot Revisited(数论)
- URAL 2011. Long Statement (数论)
- URAL 1139. City Blocks (数论)
- URAL 1907. Coffee and Buns(数论推导+容斥原理)
- URAL 1356
- Interesting Numbers URAL - 2070 数论
- [数论] HOJ 1356 Prime Judge Miller Rabin+快速幂
- URAL 1356. Something Easier(哥德巴赫猜想)
- Ural2102:Michael and Cryptography(数论&素数)
- Ural 2003: Simple Magic(数论&思维)
- Ural1110(数论)
- [求解二次剩余 数论技巧 随机化] Ural 1132 Square Root
- URAL 1104 Don’t Ask Woman about Her Age(数论)
- URAL 1133 Fibonacci Sequence(数论)
- URAL 2070 Interesting Numbers(数论)
- URAL——1204(数论之线性方程)