UVa 10168 Summation of Four Primes
2015-07-26 15:17
134 查看
原题链接:点击打开链接
题意:将一个数拆分成四个素数(可以为同一个素数)相加的和;若不能拆分输出“ Impossible.”
思路: 哥德巴赫猜想:>=4的偶数可以拆分成两个素数的和
哥德巴赫猜想推论>=8的偶数都能被拆分成四个素数相加的形式
8=2+2+2+2,2是最小的素数,8是能被拆分的最小数,当n<8时 输出“Impossible”,
如果是奇数可以拆成2+3+ n-5(偶数),n-5这个数一定可以拆成两个素数相加;
如果是偶数 可以拆成2+2+ n-4(偶数),n-4这个数一定可以拆成两个素数相加;
code:
题意:将一个数拆分成四个素数(可以为同一个素数)相加的和;若不能拆分输出“ Impossible.”
思路: 哥德巴赫猜想:>=4的偶数可以拆分成两个素数的和
哥德巴赫猜想推论>=8的偶数都能被拆分成四个素数相加的形式
8=2+2+2+2,2是最小的素数,8是能被拆分的最小数,当n<8时 输出“Impossible”,
如果是奇数可以拆成2+3+ n-5(偶数),n-5这个数一定可以拆成两个素数相加;
如果是偶数 可以拆成2+2+ n-4(偶数),n-4这个数一定可以拆成两个素数相加;
code:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; const int maxx=10000007; int prim[1000000],s[maxx]; int cnt; void init() { cnt=0; memset(s,0,sizeof(0)); s[1]=1; s[0]=1; for(int i=2;i<maxx;i++) { if(!s[i]) { prim[cnt++]=i; for(int j=i+i;j<maxx;j+=i) s[j]=1; } } } int main() { int n,i,j; init(); while(scanf("%d",&n)!=EOF) { if(n<8) { printf("Impossible.\n"); continue; } if(n%2==0) { int a=2; int b=2; int c,d; n-=4; for(i=0;i<cnt;i++) { if(n<prim[i]) break; int t=n-prim[i];//printf("n-prim[i]= %d\n",s[t]); if(s[t]==0) { c=prim[i]; d=n-prim[i]; break; } } printf("%d %d %d %d\n",a,b,c,d); } else { int a=2; int b=3; int c,d; n-=5; for( i=0;i<cnt;i++) { if(s[n-prim[i]]==0) { c=prim[i]; d=n-prim[i]; break; } } printf("%d %d %d %d\n",a,b,c,d); } } return 0; }
相关文章推荐
- UVa 11205 - The broken pedometer
- 图标字体(IconFont)制作
- slowhttptest使用参数说明
- Andy's First Dictionary
- 九度oj 1074
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
- [ORM] Entity Framework(2) CodeFirst进阶
- React学习系列一
- UML类图简介
- Menu菜单之ContextMenu
- 二叉树非递归后缀遍历
- ListView嵌套GridView点击空白地方无法触发ListView点击事件解决方法
- 揭开CSS3媒体查询迷雾(min-width和max-width)
- Mac上的抓包工具Charles 附下载链接
- 【bzoj1031】【JSOI2007】【字符加密Cipher】
- 【Codevs3160】最长公共子串
- Android实战简易教程-第二十七枪(Android设置头像上传功能实现)
- HTML5基础06----HTML5样式的使用
- xhost display详解
- poj 1502 MPI Maelstrom(最短路)