jiangbin00cn 发表于 2008-10-4 00:13:00

所谓不用考虑括号不过是针对程序处理而言
而我说的是针对推理证明
这一题如果不能证明1~n的数能够连续表示出1~(1+2)*3*...n的正整数
即时你能够做出11,还有12,13...
而且不考虑除的话结果肯定不对

zed 发表于 2008-10-4 08:08:41

原帖由 jiangbin00cn 于 2008-10-4 00:13 发表 http://bbs.emath.ac.cn/images/common/back.gif
所谓不用考虑括号不过是针对程序处理而言
而我说的是针对推理证明
这一题如果不能证明1~n的数能够连续表示出1~(1+2)*3*...n的正整数
即时你能够做出11,还有12,13...
而且不考虑除的话结果肯定不对
你应该先查看一下前面已经得出的一些结果。在做猜想时起码得检验一下是否成立

无心人 发表于 2008-10-4 08:49:26

我来回答吧
1、没有括号是针对程序设计的
你仔细研究下我说的中序遍历下的表达式树序列
只要考虑从右边连续取数字压栈
碰到计算符号,弹出两个数字,计算后压栈
直到序列空,就会得到表达式值,当然也能得到带括号的原始表达式的
2、并不能表示1到n! * 3 / 2的所有连续数字
比如1-4,就不可以的
3、不考虑除法是因为除法有点复杂,这个问题一个数字有很多表示方法
不考虑除法会减少一些数字被成功解析的机会,但会大大增加速度
有除法参与的运算,需要考虑6种可能,没有除法仅考虑4种就可以了
而且加减乘运算,只需要运算,除法需要判定0做除数和是否除尽的
我们只是研究如果去掉除法,是否会对整体没有影响,我想可能在大数字下有影响

[ 本帖最后由 无心人 于 2008-10-4 08:50 编辑 ]

mathe 发表于 2008-10-4 15:58:48

好像我这个最新的将中间结果保存到文件的程序比上一个版本(不保存到文件的)速度还要慢很多:L 实在没有想到,可能是文件访问太慢了.早知道原先版本就不应该停小来了.
不过这个程序现在已经完全产生了使用11个数中不超过8个数的所有可能结果(只保存结果值),所有数据才133M(看来都可以直接保存在内存中)

无心人 发表于 2008-10-4 18:02:14

:b:

这么低啊????
我的可没这么低
11的我估计是现有硬盘空间无法承受的

mathe 发表于 2008-10-4 21:14:45

是不是结果相等的表达式你重复保存了。

无心人 发表于 2008-10-5 09:26:27

是啊

可是结果相同的,使用的数字不一定相同啊
你觉得没有必要么?

mathe 发表于 2008-10-5 17:39:26

下面程序你可以运行一下看,Windows下面运行
#include "stdafx.h"
#define N 12
#include <set>
using namespace std;

bool has_set(int x[],int size)
{
    int mask=0;
    int i;
    char fName;
    for(i=0;i<size;i++){
      mask|=1<<(x-1);
    }
    sprintf(fName,"data\\%d",mask);
    FILE *pFile=fopen(fName,"rb");
    if(pFile==NULL)
      return false;
    fclose(pFile);
    return true;
}

#define BUFF_LEN 4096
int buff;
int buff2;

void output_r(int i)
{
    int s=(1<<i)-1;
    char fName;
    sprintf(fName,"data\\%d",s);
    FILE *pFile=fopen(fName,"rb");
    if(pFile==NULL){
      fprintf(stderr,"Cannot read file %s\n",fName);
      exit(-1);
    }
    int yu=fread(buff,sizeof(int),BUFF_LEN,pFile);
    int x=1,start;
    if(buff==0)start=1;else start=0;
    while(buff==x){
      x++;
      start++;
      if(start>=yu){
            if(yu==BUFF_LEN){
                yu=fread(buff,sizeof(int),BUFF_LEN,pFile);
                start=0;
                if(yu==0)break;
            }else break;
      }
    }
    printf("r[%d]=%d\n",i,x);
    fclose(pFile);
}

void save_set(const set<int>& result, int x[],int size)
{
    int mask=0;
    int i;
    char fName;
    for(i=0;i<size;i++){
      mask|=1<<(x-1);
    }
    sprintf(fName,"data\\%d",mask);
    FILE *pFile=fopen(fName,"wb");
    if(pFile==NULL){
      fprintf(stderr,"Cannot write file %s\n",fName);
      exit(-1);
    }
    int j;
    set<int>::const_iterator cit;
    i=j=0;
    for(cit=result.begin();cit!=result.end();++cit){
      buff=*cit;
      i++;
      if(j==BUFF_LEN){
            j=0;
            fwrite(buff,sizeof(int),BUFF_LEN,pFile);
      }
    }
    if(j>0){
      fwrite(buff,sizeof(int),j,pFile);
    }
    fclose(pFile);

    if((mask&(mask+1))==0){
      output_r(size);
    }
}


void add_result(set<int>& result, int y[],int yc,int z[],int zc)
{
    int mask=0;
    int i,j;
    char fName;
    FILE *yFile,*zFile;
    int yu,zu;
    if(yc<=2){
      if(yc==1){
            yu=1;
            buff=y;
      }else{
            yu=3;
            buff=y+y;
            buff=abs(y-y);
            buff=y*y;
      }
      yFile=NULL;
    }else{
      mask=0;
      for(i=0;i<yc;i++){
            mask|=1<<(y-1);
      }
      sprintf(fName,"data\\%d",mask);
      yFile=fopen(fName,"rb");
      if(yFile==NULL){
            fprintf(stderr,"Cannot read file %s\n",fName);
            exit(-1);
      }
      yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
    }
    if(zc<=2){
      if(zc==1){
            zu=1;
            buff2=z;
      }else{
            zu=3;
            buff2=z+z;
            buff2=abs(z-z);
            buff2=z*z;
      }
      zFile=NULL;
    }else{
      mask=0;
      for(i=0;i<zc;i++){
            mask|=1<<(z-1);
      }
      sprintf(fName,"data\\%d",mask);
      zFile=fopen(fName,"rb");
      if(zFile==NULL){
            fprintf(stderr,"Cannot read file %s\n",fName);
            exit(-1);
      }
      zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
    }
    if(zu<BUFF_LEN){
      do{
            for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                result.insert(buff2+buff);
                result.insert(buff2*buff);
                result.insert(abs(buff2-buff));
            }
            if(yu<BUFF_LEN)break;
            yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
      }while(1);
    }else if(yu<BUFF_LEN){
      do{
            for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                result.insert(buff2+buff);
                result.insert(buff2*buff);
                result.insert(abs(buff2-buff));
            }
            if(zu<BUFF_LEN)break;
            zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
      }while(1);
    }else{
      do{
            do{
                for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                  result.insert(buff2+buff);
                  result.insert(buff2*buff);
                  result.insert(abs(buff2-buff));
                }
                if(yu<BUFF_LEN)break;
                yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
            }while(1);
            if(zu<BUFF_LEN)break;
            zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
            if(zu==0)break;
            fseek(yFile,0,SEEK_SET);
            yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
      }while(1);
    }
    if(yFile)fclose(yFile);
    if(zFile)fclose(zFile);
}


void gen_set(int x[],int size)
{
    int y,z;
    int i,j,yc,zc;
    if(size<=2)return;
    if(has_set(x,size))return;
    set<int> result;
    for(i=1;i<(1<<size)-1;i+=2){
      yc=zc=0;
      for(j=0;j<size;j++){
            if(i&(1<<j)){
                y=x;
            }else{
                z=x;
            }
      }
      gen_set(y,yc);
      gen_set(z,zc);
      add_result(result,y,yc,z,zc);
    }
    save_set(result,x,size);
}


int _tmain(int argc, _TCHAR* argv[])
{
    int x[]={1,2,3,4,5,6,7,8,9,10,11,12};
    system("mkdir data");
    gen_set(x,N);
        return 0;
}

mathe 发表于 2008-10-5 18:58:33

上面程序我在笔记本上用N=10运行了一下,花费时间还不算长,几分钟。但是N=11时间就受不了了。今天只有笔记本可以用,不能长时间运行程序。

无心人 发表于 2008-10-5 19:59:12

:)

N=10你得到的输出和前面你原始的程序结果一致么?
另外,你估计下N=11可以改成持续运行的程序么?
或者说N=11需要不可中断的运行时间是多少?

假设在24小时内,甚至在72小时我想也可接受
如果是超过72小时,则可能不能保证停电后能继续
页: 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18
查看完整版本: 最小无法表达的正整数