| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1816 人关注过本帖
标题:把任意可以分解的数分为不同的素数之和(不好分得会提示)----递归实现
取消只看楼主 加入收藏
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
结帖率:100%
收藏
 问题点数:0 回复次数:7 
把任意可以分解的数分为不同的素数之和(不好分得会提示)----递归实现
#include "stdio.h"
#include"stdlib.h"
int a[1000];
int b[1000]={1};
int j=0;
int b1;
int rem=1;
int pn()
{   int flag;
    if(j>0&&rem)
        b[j]=b[j-1];
    rem=1;
    b[j]=b[j]+1;
    do
    {   flag=0;
        int flag1=0;
        for(int i=1;i<=b[j];i++)
            if(b[j]%i==0)
            {
                if(++flag1==3)
                    flag=1;   
            }
    }while(b[j]++&&flag);
       b[j]=b[j]-1;
    return b[j];
}

int reduce(int s,int n)
{   
    if(s>0)
    {
      n=pn();
      j++;
    }
    if(s==0)
        return 1;
    if(s<0)
    {
        j=j-2;
        rem=0;
        return 0;
    }
     if(s>b1||b[j]>b1)
        {
         printf("没有结果!");
         exit(0);
        }
    if(reduce(s-n,n))
        {
          return 1;
        }
    
    return(reduce(s+b[j],b[j]));
}

int main()
{  
    scanf("%d",&b1);
    reduce(b1,2);
    for(int i=0;i<j;i++)
        printf("%d  ",b[i]);
    return 0;
}
只是为了看看结果,代码很烂.....
搜索更多相关主题的帖子: 素数 之和 递归 分解 提示 
2008-04-12 12:24
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
对的..我只是不知道是不是从2开始

学习需要安静。。海盗要重新来过。。
2008-04-12 12:52
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
这个是从3开始分析的
#include "stdio.h"
#include"stdlib.h"
int a[1000];
int b[1000]={2};
int j=0;
int b1;
int rem=1;
int pn()
{   int flag;
    if(j>0&&rem)
        b[j]=b[j-1];
    rem=1;
    b[j]=b[j]+1;
    do
    {   flag=0;
        int flag1=0;
        for(int i=1;i<=b[j];i++)
            if(b[j]%i==0)
            {
                if(++flag1==3)
                    flag=1;   
            }
    }while(b[j]++&&flag);
       b[j]=b[j]-1;
    return b[j];
}

int reduce(int s,int n)
{   
    if(s>0)
    {
      n=pn();
      j++;
    }
    if(s==0)
        return 1;
    if(s<0)
    {
        j=j-2;
        rem=0;
        return 0;
    }
     if(s>b1||b[j]>b1)
        {
         printf("没有结果!");
         exit(0);
        }
    if(reduce(s-n,n))
        {
          return 1;
        }
    
    return(reduce(s+b[j],b[j]));
}

int main()
{   int sum=0;
    scanf("%d",&b1);
    reduce(b1,2);
    for(int i=0;i<j;i++)
    {
        printf("%d  ",b[i]);
    //    sum+=b[i];
    }
//    printf("%d",sum);
    return 0;
}
我只是把它拆开来..只找到一种就停止了...没有继续找..可能结果上有点差别
比如5 可以分为2 和3  
7就是7自己
6是没有的
..........
如果找到错,可以贴出来讨论..谢谢..

[[it] 本帖最后由 sunkaidong 于 2008-4-12 13:02 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-04-12 12:56
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
15 =2+13 这个错了吗?我并不是得到最多素数和..找到就可以了...

学习需要安静。。海盗要重新来过。。
2008-04-12 13:07
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
2+13不行吗?呵呵..好像也满足素数之和条件...

学习需要安静。。海盗要重新来过。。
2008-04-12 13:13
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
是啊..哪个需要回归到2,再从2往下找..当找到时纪录个数...在输出结果..那就很麻烦了....呵呵..燕子你的代码很好,让我有种看大师写的代码感觉...

学习需要安静。。海盗要重新来过。。
2008-04-12 13:36
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
稍微改了一下
#include "stdio.h"
#include"stdlib.h"
int b[1000]={1};
int j;
int b1;
int rem=1;
int m=0;
int pn()
{   int flag;
    if(j>0&&rem)
        b[j]=b[j-1];
    rem=1;
    b[j]=b[j]+1;
    do
    {   flag=0;
        int flag1=0;
        for(int i=1;i<=b[j];i++)
            if(b[j]%i==0)
            {
                if(++flag1==3)
                    flag=1;   
            }
    }while(b[j]++&&flag);
       b[j]=b[j]-1;
    return b[j];
}

int reduce(int s,int n)
{   
    if(s>0)
    {
      n=pn();
      j++;
    }
    if(s==0)
        return 1;
    if(s<0)
    {
        j=j-2;
        rem=0;
        return 0;
    }
     if(s>b1||b[j]>b1)
        {
         printf("没有结果!");
         exit(0);
        }
    if(reduce(s-n,n))
        {
          return 1;
        }
   
    return(reduce(s+b[j],b[j]));
}

int main()
{  
    scanf("%d",&b1);
    while(b[0]<b1)
    {
    j=0;
    if(reduce(b1,b[0]))

    {   if(m<j)
        {
            for(int i=0;i<j;i++)
                printf("%d  ",b[i]);
            m=j;
            printf("\n");
        }
        
    }
     
     }
    return 0;
}

学习需要安静。。海盗要重新来过。。
2008-04-12 18:42
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
原本想把改成可以分解成所有不同素数组合得..太长了..所以可以稳定输出最长素数组合..其它也输出间或的组合..属于不稳定的方法...可以看看就好..代码风格很糟糕..

学习需要安静。。海盗要重新来过。。
2008-04-12 18:44
快速回复:把任意可以分解的数分为不同的素数之和(不好分得会提示)----递归实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016866 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved