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小时,则可能不能保证停电后能继续