整数的素数和分解问题
2012-09-07 18:56
495 查看
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。
对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式
)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。
对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式
)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
#include "stdio.h" #include "math.h" #include "string.h" #define N 1000 #define M 100 int odd[M]; int n; void get(){ int i, j, t; odd[0] = 2; n = 1; i = 3; while(n<M){ t = (int)sqrt(i); for(j=0; odd[j]<=t; j++){ if(i%odd[j] == 0) break; } if(odd[j]>t) odd[n++] = i; i++; } } int dp ; //dp[i][j]: i, end with odd[j] int ans[M]; int c; void show(int s, int l, int k){ int i; if(!s){ for(i=l-1; i>=0; i--) printf("%d ", ans[i]); printf("\n"); c++; return; } for(i=0; i<=k; i++){ if(dp[s][i]){ ans[l] = odd[i]; show(s-odd[i], l+1, i); } } } int main(){ int i, j, z; int s; get(); while(scanf("%d", &s), s>=4){ c = 0; memset(dp, 0, sizeof(dp)); for(i=0; odd[i]<=s; i++) dp[odd[i]][i] = 1; for(i=2; i<=s; i++){ for(j=0; odd[j]<i; j++){ for(z=j; z>=0; z--){ dp[i][j] |= dp[i-odd[j]][z]; } } } show(s, 0, j-1); printf("共%d种分法!\n", c); } return 0; }
相关文章推荐
- 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 158 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- C程序实现整数的素数和分解问题
- 面试题精选(66):整数的素数和分解问题
- 整数的素数和分解问题
- 整数的素数和分解问题
- [南阳OJ-No.24]素数距离问题|现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。 如果输入的整数本身就是素
- 将一个整数分解为一个或者多个素数的乘积
- Pollard_rho算法(大整数的因子分解或判断是否为素数)
- 数论——素数筛选法与整数的素因子分解
- 整数因子的分解问题--java
- 分解一个整数为素数的乘积形式
- 整数因子分解问题
- 数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)
- 关于C语言解决正序整数分解的问题