论坛: 编程破解 标题: 请问如何防止数列重复? 复制本贴地址    
作者: ysfilone [ysfilone]    论坛用户   登录
我想用下面的函数实现求解  把任意一个自然数(当然是大于一个特定值的)表示成
>=2个的质数之和的  表达式个数,例如:9=2+7=2+2+5=……然后统计数列的个数

sushu(int n); 判断n是否为质数,如果是 返回1,否则返回2
代码:

void Fsushu(int n)
{
int i,j;

for(i=2;i<=n/2;i++)
{
  if(sushu(i))
  { printf("%d",i);
    j=n-i;

    if(sushu(j))
    {
      counter++;
      printf("%d\n",j);
    }
    if(j>2)
      Fsushu(j);

    }
}
return;
}



问题是 为了避免数列重复,如:9=2+2+2+3=2+3+2+2
因该如何做???在上面代码中 把限定条件设为i<=n/2不行的

还有如果要求打印出每个合法的数列 因该怎么办??

真诚希望各位帮一下小弟,谢谢了~!!!

地主 发表时间: 04-04-18 08:10

回复: ysfilone [ysfilone]   论坛用户   登录
自己定以下

B1层 发表时间: 04-04-18 20:03

回复: lida1818 [lida1818]   论坛用户   登录
好象没什么好的算法。可以建一个temp文件,将所有的输出暂时输入到文件,然后读出所需的数组。

不知其它人有没有好算法。

B2层 发表时间: 04-04-19 13:23

回复: 286 [unique]   版主   登录
#include <stdio.h>

int buff[100]={0};

bool sushu(int i)
{
for (int j=2;j<=i/2;j++)
if (i%j==0)
  return false;
return true;
}

bool Fsushu(int n,int beginfrom,int level)
{
int i,j;
if (n==0)
{
  for (j=0;j<level;j++)
  printf("%d\t",buff[j]);
  printf("\n");
  return true;
}
if (n<beginfrom)
  return false;
for (i=beginfrom;i<=n;i++)
{
  if (sushu(i))
  {
  buff[level]=i;
  Fsushu(n-i,i,level+1);
  }
}
return false;
}

void main()
{
Fsushu(9,2,0);
}
//以上程序过于完美,因此暂不提供注释和解释。

[此贴被 286(unique) 在 04月19日14时56分 编辑过]

B3层 发表时间: 04-04-19 14:55

回复: ysfilone [ysfilone]   论坛用户   登录
呵呵 谢谢286 

我判断素数的函数如下:

bool sushu(int n)
{
int i=2;

while(i<=n&&(n%i))
i++;
if(i==n)  return true;
else return false;
}


显然不如286的


[此贴被 远山之城(ysfilone) 在 04月20日07时06分 编辑过]

B4层 发表时间: 04-04-19 18:29

回复: lida1818 [lida1818]   论坛用户   登录
int buff[100]={0};


问题是这个buff[],如果计算比较大的数字就比较占内存,比如计算10000,则需buff[5000]
(如果是在处理类似的实际问题好象不妥)
不知是否还有更好的算法?

B5层 发表时间: 04-04-20 09:34

回复: vloadpe [vloadpe]   论坛用户   登录
喝喝喝,这个题本来就很BT,排列太多啦

B6层 发表时间: 04-04-20 09:47

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号