- 注册时间
 - 2007-12-27
 
- 最后登录
 - 1970-1-1
 
- 威望
 -  星
 
- 金币
 -  枚
 
- 贡献
 -  分
 
- 经验
 -  点
 
- 鲜花
 -  朵
 
- 魅力
 -  点
 
- 上传
 -  次
 
- 下载
 -  次
 
- 积分
 - 49015
 
- 在线时间
 -  小时
 
 
 
 
 
 
 | 
 
 楼主 |
发表于 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[20];
 -     for(i=0;i<size;i++){
 -         mask|=1<<(x[i]-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[BUFF_LEN];
 - int buff2[BUFF_LEN];
 - 
 - void output_r(int i)
 - {
 -     int s=(1<<i)-1;
 -     char fName[20];
 -     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]==0)start=1;else start=0;
 -     while(buff[start]==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[20];
 -     for(i=0;i<size;i++){
 -         mask|=1<<(x[i]-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[j++]=*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[20];
 -     FILE *yFile,*zFile;
 -     int yu,zu;
 -     if(yc<=2){
 -         if(yc==1){
 -             yu=1;
 -             buff[0]=y[0];
 -         }else{
 -             yu=3;
 -             buff[0]=y[0]+y[1];
 -             buff[1]=abs(y[0]-y[1]);
 -             buff[2]=y[0]*y[1];
 -         }
 -         yFile=NULL;
 -     }else{
 -         mask=0;
 -         for(i=0;i<yc;i++){
 -             mask|=1<<(y[i]-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[0]=z[0];
 -         }else{
 -             zu=3;
 -             buff2[0]=z[0]+z[1];
 -             buff2[1]=abs(z[0]-z[1]);
 -             buff2[2]=z[0]*z[1];
 -         }
 -         zFile=NULL;
 -     }else{
 -         mask=0;
 -         for(i=0;i<zc;i++){
 -             mask|=1<<(z[i]-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[i]+buff[j]);
 -                 result.insert(buff2[i]*buff[j]);
 -                 result.insert(abs(buff2[i]-buff[j]));
 -             }
 -             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[i]+buff[j]);
 -                 result.insert(buff2[i]*buff[j]);
 -                 result.insert(abs(buff2[i]-buff[j]));
 -             }
 -             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[i]+buff[j]);
 -                     result.insert(buff2[i]*buff[j]);
 -                     result.insert(abs(buff2[i]-buff[j]));
 -                 }
 -                 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[N],z[N];
 -     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[yc++]=x[j];
 -             }else{
 -                 z[zc++]=x[j];
 -             }
 -         }
 -         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;
 - }
 
  复制代码 |   
 
 
 
 |