Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4843020
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-11 17:58:35

【问题描述】
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。

例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5

【算法分析】
由于要将指定整数N分解为素数之和,则首先需要计算出该整数N内的所有素数,然后递归求解所有素数和分解即可。
 
先是要求出N内的所有素数...再递归
void decompose(int num, int Primes[], int from, int Prime_counts)
{
  int i;
  if(num == 0)
   {
     print;
   }
  
  for(i=from; i<Prime_counts; ++i)
   {
     if(num < Primes[i])
       break;
       
     push_stack(S, Primes[i]);
     decompose( num-Primes[i] , Primes, i, Prime_counts);
     pop_stack(S);
   }
}

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PRIMES_NUMS 8
#define QUIT 999

typedef struct stack
{
  int top;
  int* num;
}STACK;

STACK* S = NULL;

int is_prime(int num)
{
  int i;
  if(num%2==0)
    return 0;
  
  for(i=3; i<sqrt(num)+1; i+=2)
   {
     if(num%i == 0)
       return 0;
   }
   
   return 1;
}

int count_primes(int num, int Primes[])
{
  int i = 0;
  int count = 0;
  
  Primes[count++] = 2;
     
  for(i=3;i<num;i+=2)
   {
     if(is_prime(i))
       Primes[count++] = i;
   }
  
  return count;
}

void init_stack(STACK** S)
{
   *S = (STACK*)malloc(sizeof(STACK));
   (*S)->top = 0;
   (*S)->num = (int*)malloc(PRIMES_NUMS*sizeof(int));
}

void push_stack(STACK* S, int elements)
{
  S->num[S->top] = elements;
  S->top++;
}

int pop_stack(STACK* S)
{
  int element = S->num[S->top];
  S->top--;
  
  return element;
}

void decompose(int num, int Primes[], int from, int Prime_counts)
{
  int i;
  if(num == 0)
   {
     int j = 0;
     for(;j<S->top;j++)
       printf("%d\t",S->num[j]);
       
     printf("\n");
   }
  
  for(i=from; i<Prime_counts; ++i)
   {
     if(num < Primes[i])
       break;
       
     push_stack(S, Primes[i]);
     decompose( num-Primes[i] , Primes, i, Prime_counts);
     pop_stack(S);
   }
}

void print_primes(int Primes[], int Counts)
{
  int i;
  for(i=0;i<Counts;i++)
   printf("%d\t", Primes[i]);
   
  printf("\n");
}
     
int main(int argc, char *argv[])
{
  int number;
  int Primes[PRIMES_NUMS];
  int prime_count;
  
  init_stack(&S);
  printf("Please input the number you want to count:\n");
  scanf("%d",&number);
  
  while(number!=QUIT)
   {
     prime_count = count_primes(number, Primes);
     //print_primes(Primes, prime_count);

     decompose(number, Primes, 0, prime_count);
     printf("Please input the number you want to count:\n");
     scanf("%d",&number);
   }
   
  system("PAUSE");    
  return 0;
}

阅读(622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~