找回密码
 欢迎注册
楼主: mathe

[擂台] 最小无法表达的正整数

[复制链接]
发表于 2008-10-7 11:14:01 | 显示全部楼层
为什么啊?

喜欢玩变态?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-9 07:42:34 | 显示全部楼层
1-11中任意多个数采用+,-,*,/不能达到1765186得到证明了.
不过要验证12个数看来很难,估计要花费很长时间.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-9 07:56:08 | 显示全部楼层
能给出验证程序么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-9 08:01:37 | 显示全部楼层
代码挺慢,分两部分.
第一部分将所有1~n之间不超过8个数字通过+,-,*,/所能得到的结果全部计算出来并且保存在文件中,其中1~11所有结果产生需要10个多小时,总共数据15.6G.
而计算1~12所产生的结果运行了37个多小时,总共数据量54G

  1. #include "stdafx.h"
  2. #define N 8
  3. #include <set>
  4. using namespace std;

  5. class number{
  6.     int up;
  7.     int down;
  8. public:
  9.     number(const number& n):up(n.up),down(n.down){}
  10.     number(int n=0):up(n),down(1){}
  11.     number& operator+=(const number& n);
  12.     number& operator-=(const number& n);
  13.     number& operator*=(const number& n);
  14.     number& operator/=(const number& n);
  15.     bool is_zero()const{return down!=0&&up==0;}
  16.     bool is_valid()const{return down!=0;}
  17.     bool is_one()const{return down!=0&&up==down;}
  18.     bool operator==(const number& n)const{return
  19.         is_valid()&&n.is_valid()&&n.down*(long long)up==n.up*(long long)down;}
  20.     bool operator<(const number& n)const;
  21.     bool operator>(const number& n)const{return n<*this;}
  22.     bool operator<=(const number& n)const{return !(*this>n);}
  23.     bool operator!=(const number& n)const{return !(n==*this);}
  24.     bool operator>=(const number& n)const{return !(*this<n);}
  25.     number operator+(const number& n)const{number m(*this);return m+=n;}
  26.     number operator-(const number& n)const{number m(*this);return m-=n;}
  27.     number operator*(const number& n)const{number m(*this);return m*=n;}
  28.     number operator/(const number& n)const{number m(*this);return m/=n;}
  29.     bool is_integer()const{return down!=0&&up%down==0;}
  30.     int get_integer()const{if(is_integer())return up/down;else return -1;}
  31.     number& operator=(int n){up=n;down=1;return *this;}
  32.     int get_up()const{return up;}
  33.     int get_down()const{return down;}
  34.         number abs()const{number x;x.up=up>=0?up:-up;x.down=down>=0?down:-down;return x;}
  35. };

  36. number& number::operator +=(const number& n)
  37. {
  38.     up=up*n.down+down*n.up;
  39.     down*=n.down;
  40.     return *this;
  41. }

  42. number& number::operator -=(const number& n)
  43. {
  44.     up=up*n.down-down*n.up;
  45.     if(up<0)up=-up;
  46.     down*=n.down;
  47.     return *this;
  48. }

  49. number& number::operator *=(const number& n)
  50. {
  51.     up*=n.up;
  52.     down*=n.down;
  53.     return *this;
  54. }

  55. number& number::operator /=(const number& n)
  56. {
  57.     down*=n.up;
  58.     up*=n.down;
  59.     return *this;
  60. }

  61. bool number::operator <(const number &n)const
  62. {
  63.     return (long long)up*n.down<n.up*(long long)down;
  64. }

  65. bool has_set(int x[],int size)
  66. {
  67.     int mask=0;
  68.     int i;
  69.     char fName[20];
  70.     for(i=0;i<size;i++){
  71.         mask|=1<<(x[i]-1);
  72.     }
  73.     sprintf(fName,"data\\%d",mask);
  74.     FILE *pFile=fopen(fName,"rb");
  75.     if(pFile==NULL)
  76.         return false;
  77.     fclose(pFile);
  78.     return true;
  79. }

  80. #define BUFF_LEN 4096
  81. number buff[BUFF_LEN];
  82. number buff2[BUFF_LEN];

  83. void output_r(int i)
  84. {
  85.     int s=(1<<i)-1;
  86.     char fName[20];
  87.     sprintf(fName,"data\\%d",s);
  88.     FILE *pFile=fopen(fName,"rb");
  89.     if(pFile==NULL){
  90.         fprintf(stderr,"Cannot read file %s\n",fName);
  91.         exit(-1);
  92.     }
  93.     int yu=fread(buff,sizeof(number),BUFF_LEN,pFile);
  94.     int x=1,start;
  95.     if(buff[0]==0)start=1;else start=0;
  96.     while(buff[start]<=x){
  97.                 if(buff[start]<x){
  98.                         start++;
  99.                 }else{
  100.                         x++;
  101.                         start++;
  102.                 }
  103.         if(start>=yu){
  104.             if(yu==BUFF_LEN){
  105.                 yu=fread(buff,sizeof(number),BUFF_LEN,pFile);
  106.                 start=0;
  107.                 if(yu==0)break;
  108.             }else break;
  109.         }
  110.     }
  111.     printf("r[%d]=%d\n",i,x);
  112.     fclose(pFile);
  113. }

  114. void save_set(const set<number>& result, int x[],int size)
  115. {
  116.     int mask=0;
  117.     int i;
  118.     char fName[20];
  119.     for(i=0;i<size;i++){
  120.         mask|=1<<(x[i]-1);
  121.     }
  122.     sprintf(fName,"data\\%d",mask);
  123.     FILE *pFile=fopen(fName,"wb");
  124.     if(pFile==NULL){
  125.         fprintf(stderr,"Cannot write file %s\n",fName);
  126.         exit(-1);
  127.     }
  128.     int j;
  129.     set<number>::const_iterator cit;
  130.     i=j=0;
  131.     for(cit=result.begin();cit!=result.end();++cit){
  132.         buff[j++]=*cit;
  133.         i++;
  134.         if(j==BUFF_LEN){
  135.             j=0;
  136.             fwrite(buff,sizeof(number),BUFF_LEN,pFile);
  137.         }
  138.     }
  139.     if(j>0){
  140.         fwrite(buff,sizeof(number),j,pFile);
  141.     }
  142.     fclose(pFile);

  143.     if((mask&(mask+1))==0){
  144.         output_r(size);
  145.     }
  146. }


  147. void add_result(set<number>& result, int y[],int yc,int z[],int zc)
  148. {
  149.     int mask=0;
  150.     int i,j;
  151.     char fName[20];
  152.     FILE *yFile,*zFile;
  153.     int yu,zu;
  154.     if(yc<=2){
  155.         if(yc==1){
  156.             yu=1;
  157.             buff[0]=y[0];
  158.         }else{
  159.             yu=5;
  160.             buff[0]=y[0]+y[1];
  161.             buff[1]=abs(y[0]-y[1]);
  162.             buff[2]=y[0]*y[1];
  163.                         buff[3]=number(y[0])/y[1];
  164.                         buff[4]=number(y[1])/y[0];
  165.         }
  166.         yFile=NULL;
  167.     }else{
  168.         mask=0;
  169.         for(i=0;i<yc;i++){
  170.             mask|=1<<(y[i]-1);
  171.         }
  172.         sprintf(fName,"data\\%d",mask);
  173.         yFile=fopen(fName,"rb");
  174.         if(yFile==NULL){
  175.             fprintf(stderr,"Cannot read file %s\n",fName);
  176.             exit(-1);
  177.         }
  178.         yu=fread(buff,sizeof(number),BUFF_LEN,yFile);
  179.     }
  180.     if(zc<=2){
  181.         if(zc==1){
  182.             zu=1;
  183.             buff2[0]=z[0];
  184.         }else{
  185.             zu=5;
  186.             buff2[0]=z[0]+z[1];
  187.             buff2[1]=abs(z[0]-z[1]);
  188.             buff2[2]=z[0]*z[1];
  189.                         buff2[3]=number(z[0])/z[1];
  190.                         buff2[4]=number(z[1])/z[0];
  191.         }
  192.         zFile=NULL;
  193.     }else{
  194.         mask=0;
  195.         for(i=0;i<zc;i++){
  196.             mask|=1<<(z[i]-1);
  197.         }
  198.         sprintf(fName,"data\\%d",mask);
  199.         zFile=fopen(fName,"rb");
  200.         if(zFile==NULL){
  201.             fprintf(stderr,"Cannot read file %s\n",fName);
  202.             exit(-1);
  203.         }
  204.         zu=fread(buff2,sizeof(number),BUFF_LEN,zFile);
  205.     }
  206.     if(zu<BUFF_LEN){
  207.         do{
  208.             for(i=0;i<zu;i++)for(j=0;j<yu;j++){
  209.                 result.insert(buff2[i]+buff[j]);
  210.                 result.insert(buff2[i]*buff[j]);
  211.                 result.insert((buff2[i]-buff[j]).abs());
  212.                                 number x=buff2[i]/buff[j];
  213.                                 if(x.is_valid()){
  214.                                         result.insert(x);
  215.                                 }
  216.                                 x=buff[j]/buff2[i];
  217.                                 if(x.is_valid()){
  218.                                         result.insert(x);
  219.                                 }
  220.             }
  221.             if(yu<BUFF_LEN)break;
  222.             yu=fread(buff,sizeof(number),BUFF_LEN,yFile);
  223.         }while(1);
  224.     }else if(yu<BUFF_LEN){
  225.         do{
  226.             for(i=0;i<zu;i++)for(j=0;j<yu;j++){
  227.                 result.insert(buff2[i]+buff[j]);
  228.                 result.insert(buff2[i]*buff[j]);
  229.                 result.insert((buff2[i]-buff[j]).abs());
  230.                                 number x=buff2[i]/buff[j];
  231.                                 if(x.is_valid()){
  232.                                         result.insert(x);
  233.                                 }
  234.                                 x=buff[j]/buff2[i];
  235.                                 if(x.is_valid()){
  236.                                         result.insert(x);
  237.                                 }
  238.             }
  239.             if(zu<BUFF_LEN)break;
  240.             zu=fread(buff2,sizeof(number),BUFF_LEN,zFile);
  241.         }while(1);
  242.     }else{
  243.         do{
  244.             do{
  245.                 for(i=0;i<zu;i++)for(j=0;j<yu;j++){
  246.                     result.insert(buff2[i]+buff[j]);
  247.                     result.insert(buff2[i]*buff[j]);
  248.                     result.insert((buff2[i]-buff[j]).abs());
  249.                                         number x=buff2[i]/buff[j];
  250.                                         if(x.is_valid()){
  251.                                                 result.insert(x);
  252.                                         }
  253.                                         x=buff[j]/buff2[i];
  254.                                         if(x.is_valid()){
  255.                                                 result.insert(x);
  256.                                         }
  257.                 }
  258.                 if(yu<BUFF_LEN)break;
  259.                 yu=fread(buff,sizeof(number),BUFF_LEN,yFile);
  260.             }while(1);
  261.             if(zu<BUFF_LEN)break;
  262.             zu=fread(buff2,sizeof(number),BUFF_LEN,zFile);
  263.             if(zu==0)break;
  264.             fseek(yFile,0,SEEK_SET);
  265.             yu=fread(buff,sizeof(number),BUFF_LEN,yFile);
  266.         }while(1);
  267.     }
  268.     if(yFile)fclose(yFile);
  269.     if(zFile)fclose(zFile);
  270. }


  271. void gen_set(int x[],int size)
  272. {
  273.     int y[N],z[N];
  274.     int i,j,yc,zc;
  275.     if(size<=2)return;
  276.     if(has_set(x,size))return;
  277.     set<number> result;
  278.     for(i=1;i<(1<<size)-1;i+=2){
  279.         yc=zc=0;
  280.         for(j=0;j<size;j++){
  281.             if(i&(1<<j)){
  282.                 y[yc++]=x[j];
  283.             }else{
  284.                 z[zc++]=x[j];
  285.             }
  286.         }
  287.         gen_set(y,yc);
  288.         gen_set(z,zc);
  289.         add_result(result,y,yc,z,zc);
  290.     }
  291.     save_set(result,x,size);
  292. }

  293. int bc(int x){
  294.         int c=0;
  295.         while(x>0){
  296.                 if(x&1)c++;
  297.                 x>>=1;
  298.         }
  299.         return c;
  300. }

  301. int _tmain(int argc, _TCHAR* argv[])
  302. {
  303.     system("mkdir data");
  304.     int x[]={1,2,3,4,5,6,7,8};
  305.         int i;
  306.         for(i=7;i<1<<12;i++){
  307.                 if(bc(i)<=8){
  308.                         int j=0,k;
  309.                         for(k=0;k<12;k++){
  310.                                 if(i&(1<<k)){
  311.                                         x[j++]=k+1;
  312.                                 }
  313.                         }
  314.                         gen_set(x,j);
  315.                 }
  316.         }
  317.         return 0;
  318. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-9 08:03:58 | 显示全部楼层
第二部分代码是有了前面的结果,那么我们就可以将表达式拆分成两部分来求解,不过现在代码写的很简单,没有什么优化,即使N=11也运行了近一个晚上,这个代码应该可以改写的好看写,当然效率也可以改善一些.但是我觉得再怎么改,验证到N=12也已经是极限了.

  1. // checker.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include <algorithm>
  5. using namespace std;
  6. #include <stdio.h>
  7. #include <stdlib.h>

  8. class number{
  9.     int up;
  10.     int down;
  11. public:
  12.     number(int u,int d):up(u),down(d){}
  13.     number(const number& n):up(n.up),down(n.down){}
  14.     number(int n=0):up(n),down(1){}
  15.     number& operator+=(const number& n);
  16.     number& operator-=(const number& n);
  17.     number& operator*=(const number& n);
  18.     number& operator/=(const number& n);
  19.     bool is_zero()const{return down!=0&&up==0;}
  20.     bool is_valid()const{return down!=0;}
  21.     bool is_one()const{return down!=0&&up==down;}
  22.     bool operator==(const number& n)const{return
  23.         is_valid()&&n.is_valid()&&n.down*(long long)up==n.up*(long long)down;}
  24.     bool operator<(const number& n)const;
  25.     bool operator>(const number& n)const{return n<*this;}
  26.     bool operator<=(const number& n)const{return !(*this>n);}
  27.     bool operator!=(const number& n)const{return !(n==*this);}
  28.     bool operator>=(const number& n)const{return !(*this<n);}
  29.     number operator+(const number& n)const{number m(*this);return m+=n;}
  30.     number operator-(const number& n)const{number m(*this);return m-=n;}
  31.     number operator*(const number& n)const{number m(*this);return m*=n;}
  32.     number operator/(const number& n)const{number m(*this);return m/=n;}
  33.     bool is_integer()const{return down!=0&&up%down==0;}
  34.     int get_integer()const{if(is_integer())return up/down;else return -1;}
  35.     number& operator=(int n){up=n;down=1;return *this;}
  36.     int get_up()const{return up;}
  37.     int get_down()const{return down;}
  38. };

  39. number& number::operator +=(const number& n)
  40. {
  41.     up=up*n.down+down*n.up;
  42.     down*=n.down;
  43.     return *this;
  44. }

  45. number& number::operator -=(const number& n)
  46. {
  47.     up=up*n.down-down*n.up;
  48.     if(up<0)up=-up;
  49.     down*=n.down;
  50.     return *this;
  51. }

  52. number& number::operator *=(const number& n)
  53. {
  54.     up*=n.up;
  55.     down*=n.down;
  56.     return *this;
  57. }

  58. number& number::operator /=(const number& n)
  59. {
  60.     down*=n.up;
  61.     up*=n.down;
  62.     return *this;
  63. }

  64. bool number::operator <(const number &n)const
  65. {
  66.     return (long long)up*n.down<n.up*(long long)down;
  67. }

  68. long long gcd(long long x,long long y)
  69. {
  70.     if(x==0)return y;
  71.     return gcd(y%x,x);
  72. }

  73. class lnumber{
  74.     long long up;
  75.     long long down;
  76. public:
  77.     lnumber(const lnumber& n):up(n.up),down(n.down){}
  78.     lnumber(const number& n):up(n.get_up()),down(n.get_down()){}
  79.     lnumber(long long n=0):up(n),down(1LL){}
  80.     lnumber& operator+=(const lnumber& n);
  81.     lnumber& operator-=(const lnumber& n);
  82.     lnumber& operator*=(const lnumber& n);
  83.     lnumber& operator/=(const lnumber& n);
  84.     bool is_zero()const{return down!=0&&up==0;}
  85.     bool is_valid()const{return down!=0;}
  86.     bool is_one()const{return down!=0&&up==down;}
  87.     void normalize(){
  88.         long long g=gcd(up,down);
  89.         up/=g;down/=g;
  90.     }
  91.     bool operator==(const lnumber& n)const{
  92.         if(!is_valid()||!n.is_valid())
  93.             return false;
  94.         if(n.down*up!=n.up*down)
  95.             return false;
  96.         ///check for overflow
  97.         long long d1=n.down%0x7FFFFFFF;
  98.         long long u1=n.up%0x7FFFFFFF;
  99.         long long d2=down%0x7FFFFFFF;
  100.         long long u2=up%0x7FFFFFFF;
  101.         if((d1*u2)%0x7FFFFFFF!=(d2*u1)%0x7FFFFFFF)
  102.             return false;
  103.         return true;
  104.     }
  105.     bool operator<(const lnumber& n)const;
  106.     bool operator>(const lnumber& n)const{return n<*this;}
  107.     bool operator<=(const lnumber& n)const{return !(*this>n);}
  108.     bool operator!=(const lnumber& n)const{return !(n==*this);}
  109.     bool operator>=(const lnumber& n)const{return !(*this<n);}
  110.     lnumber operator+(const lnumber& n)const{lnumber m(*this);return m+=n;}
  111.     lnumber operator-(const lnumber& n)const{lnumber m(*this);return m-=n;}
  112.     lnumber operator*(const lnumber& n)const{lnumber m(*this);return m*=n;}
  113.     lnumber operator/(const lnumber& n)const{lnumber m(*this);return m/=n;}
  114.     bool is_integer()const{return down!=0&&up%down==0;}
  115.     long long get_integer()const{if(is_integer())return up/down;else return -1LL;}
  116.     lnumber& operator=(long long n){up=n;down=1LL;return *this;}
  117.     long long get_up()const{return up;}
  118.     long long get_down()const{return down;}
  119. };

  120. lnumber& lnumber::operator +=(const lnumber& n)
  121. {
  122.     up=up*n.down+down*n.up;
  123.     down*=n.down;
  124.     return *this;
  125. }

  126. lnumber& lnumber::operator -=(const lnumber& n)
  127. {
  128.     up=up*n.down-down*n.up;
  129.     if(up<0)up=-up;
  130.     down*=n.down;
  131.     return *this;
  132. }

  133. lnumber& lnumber::operator *=(const lnumber& n)
  134. {
  135.     up*=n.up;
  136.     down*=n.down;
  137.     return *this;
  138. }

  139. lnumber& lnumber::operator /=(const lnumber& n)
  140. {
  141.     down*=n.up;
  142.     up*=n.down;
  143.     return *this;
  144. }

  145. #define M32 0xFFFFFFFF
  146. void mult128(unsigned int out[4],long long in1, long long in2)
  147. {
  148.     unsigned high1,low1,high2,low2;
  149.     high1=(in1>>32)&M32;
  150.     low1=in1&M32;
  151.     high2=(in2>>32)&M32;
  152.     low2=in2&M32;
  153.     unsigned long long r1,r2,r3,r4;
  154.     r1=low1*low2;
  155.     r2=low1*high2;
  156.     r3=high1*low2;
  157.     r4=high1*high2;
  158.     out[0]=(unsigned)(r1&M32);
  159.     unsigned long long u=(r1>>32)&M32;
  160.     u+=(r2&M32)+(r3&M32);
  161.     out[1]=(unsigned)(u&M32);
  162.     u=u>>32;
  163.     u+=(r2>>32)+(r3>>32);
  164.     u+=r4&M32;
  165.     out[2]=(unsigned)(u&M32);
  166.     u=u>>32;
  167.     u+=(r4>>32);
  168.     out[3]=(unsigned)u;
  169. }

  170. bool lnumber::operator <(const lnumber &n)const
  171. {
  172.     unsigned int r1[4],r2[4];
  173.     int i;
  174.     mult128(r1,up,n.down);
  175.     mult128(r2,n.up,down);
  176.     for(i=3;i>=0;i--){
  177.         if(r1[i]<r2[i])
  178.             return true;
  179.         if(r1[i]>r2[i])
  180.             return false;
  181.     }
  182. }

  183. #define DATA_PATH "..\\..\\unr2\\unr2\\data\"
  184. #define FILT_PATH "..\\..\\unr2\\unr2\\idata\"
  185. #define T 38103

  186. int bc(int x){
  187.         int c=0;
  188.         while(x>0){
  189.                 if(x&1)c++;
  190.                 x>>=1;
  191.         }
  192.         return c;
  193. }

  194. #define BUFF_LEN 4096
  195. #define MAX_BUFF_SIZE (40*1024*1024)
  196. number buff[BUFF_LEN];
  197. number buff2[MAX_BUFF_SIZE];

  198. bool test(number buff2[],int zu, const lnumber& r)
  199. {
  200.     lnumber rr=r;rr.normalize();
  201.     if(rr.get_up()>0x7FFFFFFF||rr.get_down()>0x7FFFFFFF)
  202.         return false;
  203.     number sr((int)rr.get_up(),(int)rr.get_down());
  204.     return binary_search(buff2,buff2+zu,sr);
  205. }


  206. ///x is small set, y is large set
  207. bool verify(int x[],int xc, int y[],int yc, const lnumber& result)
  208. {
  209.     int mask1,mask2;
  210.     char f1Name[100],f2Name[100];
  211.     int i;
  212.     mask1=mask2=0;
  213.     for(i=0;i<xc;i++){
  214.         mask1|=1<<(x[i]-1);
  215.     }
  216.     for(i=0;i<yc;i++){
  217.         mask2|=1<<(y[i]-1);
  218.     }
  219.     sprintf(f1Name,DATA_PATH "%d",mask1);
  220.     sprintf(f2Name,DATA_PATH "%d",mask2);
  221.     FILE *f1,*f2;
  222.     f1=f2=NULL;
  223.     int yu,zu;
  224.     if(xc>2){
  225.         f1=fopen(f1Name,"rb");
  226.         if(f1==NULL){
  227.             fprintf(stderr,"Cannot open file %s\n",f1Name);
  228.             exit(-1);
  229.         }
  230.         yu=fread(buff,sizeof(number),BUFF_LEN,f1);
  231.     }else{
  232.         if(xc==1){
  233.             yu=1;
  234.             buff[0]=x[0];
  235.         }else{
  236.             yu=5;
  237.             buff[0]=x[0]+x[1];
  238.             buff[1]=abs(x[0]-x[1]);
  239.             buff[2]=x[0]*x[1];
  240.             buff[3]=number(x[0])/x[1];
  241.             buff[4]=number(x[1])/x[0];
  242.         }
  243.     }
  244.     f2=fopen(f2Name,"rb");
  245.     if(f2==NULL){
  246.         fprintf(stderr,"Cannot open file %s\n",f2Name);
  247.         exit(-1);
  248.     }
  249.     zu=fread(buff2,sizeof(number),MAX_BUFF_SIZE,f2);
  250.     fclose(f2);

  251.     do{
  252.         for(i=0;i<yu;i++){
  253.             lnumber lx=buff[i];
  254.             lnumber s=lx+result;
  255.             if(test(buff2,zu,s)){
  256.                 if(f1)fclose(f1);
  257.                 return true;
  258.             }
  259.             s=lx-result;
  260.             if(test(buff2,zu,s)){
  261.                 if(f1)fclose(f1);
  262.                 return true;
  263.             }
  264.             if(!lx.is_zero()){
  265.                 s=lx*result;
  266.                 if(test(buff2,zu,s)){
  267.                     if(f1)fclose(f1);
  268.                     return true;
  269.                 }
  270.             }
  271.             if(result.is_zero()&&lx.is_zero()){
  272.                 if(f1)fclose(f1);
  273.                 return true;
  274.             }
  275.             if(!lx.is_zero()){
  276.                 s=result/lx;
  277.                 if(test(buff2,zu,s)){
  278.                     if(f1)fclose(f1);
  279.                     return true;
  280.                 }
  281.             }
  282.             if(!lx.is_zero()&&!result.is_zero()){
  283.                 s=lx/result;
  284.                 if(test(buff2,zu,s)){
  285.                     if(f1)fclose(f1);
  286.                     return true;
  287.                 }
  288.             }
  289.         }
  290.         if(yu<BUFF_LEN)break;
  291.         yu=fread(buff,sizeof(number),BUFF_LEN,f1);
  292.     }while(1);

  293.     if(f1)fclose(f1);
  294.     return false;
  295. }

  296. bool vs(int x[],int c, lnumber result)
  297. {
  298.         result.normalize();
  299.         if(result.get_up()>=0x7FFFFFFF||result.get_down()>=0x7FFFFFFF)
  300.                 return false;
  301.         number sr((int)result.get_up(),(int)result.get_down());
  302.     int mask;
  303.     char fName[100];
  304.     int i;
  305.     mask=0;
  306.     for(i=0;i<c;i++){
  307.         mask|=1<<(x[i]-1);
  308.     }
  309.     sprintf(fName,DATA_PATH "%d",mask);
  310.     FILE *f;
  311.     f=NULL;
  312.     int yu;
  313.     if(c>2){
  314.         f=fopen(fName,"rb");
  315.         if(f==NULL){
  316.             fprintf(stderr,"Cannot open file %s\n",fName);
  317.             exit(-1);
  318.         }
  319.         yu=fread(buff,sizeof(number),BUFF_LEN,f);
  320.     }else{
  321.         if(c==1){
  322.             yu=1;
  323.             buff[0]=x[0];
  324.         }else{
  325.             yu=5;
  326.             buff[0]=x[0]+x[1];
  327.             buff[1]=abs(x[0]-x[1]);
  328.             buff[2]=x[0]*x[1];
  329.             buff[3]=number(x[0])/x[1];
  330.             buff[4]=number(x[1])/x[0];
  331.         }
  332.     }

  333.         do{
  334.                 for(i=0;i<yu;i++){
  335.                         if(buff[i]==sr){
  336.                                 if(f)fclose(f);
  337.                                 return true;
  338.                         }
  339.                 }
  340.         if(yu<BUFF_LEN)break;
  341.         yu=fread(buff,sizeof(number),BUFF_LEN,f);
  342.     }while(1);
  343.         if(f)fclose(f);
  344.         return false;
  345. }

  346. bool v9(int x[],lnumber result)
  347. {///verify 9 elements in x could get 'result'
  348.     int u;
  349.     int i,j;
  350.     int N=9;
  351.     int uc,vc;
  352.     int au[9],av[9];
  353.     for(u=(N+1)/2;u<=8;u++){
  354.         int v=N-u;
  355.         for(i=1;i<(1<<N)-1;i++){
  356.             if(bc(i)==v){
  357.                 uc=vc=0;
  358.                 for(j=0;j<N;j++){
  359.                     if(i&(1<<j)){
  360.                         av[vc++]=j+1;
  361.                     }else{
  362.                         au[uc++]=j+1;
  363.                     }
  364.                 }
  365.                 if(verify(av,vc,au,uc,result))
  366.                     return true;
  367.             }
  368.         }
  369.     }
  370.     return false;
  371. }

  372. bool v10(int x[],lnumber result)
  373. {
  374.     int u;
  375.     int i,j;
  376.     int N=10;
  377.     int uc,vc;
  378.     int au[10],av[10];
  379.     for(u=(N+1)/2;u<=8;u++){
  380.         int v=N-u;
  381.         for(i=1;i<(1<<N)-1;i++){
  382.             if(bc(i)==v){
  383.                 uc=vc=0;
  384.                 for(j=0;j<N;j++){
  385.                     if(i&(1<<j)){
  386.                         av[vc++]=x[j];
  387.                     }else{
  388.                         au[uc++]=x[j];
  389.                     }
  390.                 }
  391.                 if(verify(av,vc,au,uc,result))
  392.                     return true;
  393.             }
  394.         }
  395.     }
  396.     for(u=0;u<10;u++){
  397.         int h=x[u];
  398.         uc=0;
  399.         for(i=0;i<10;i++){
  400.             if(i!=u){
  401.                 au[uc++]=x[i];
  402.             }
  403.         }
  404.         if(v9(au,result+h))
  405.             return true;
  406.         if(v9(au,result-h))
  407.             return true;
  408.         if(result.is_zero()&&h==0)return true;
  409.         if(h!=0){
  410.             if(v9(au,result*h))
  411.                 return true;
  412.             if(v9(au,result/h))
  413.                 return true;
  414.             if(!result.is_zero()){
  415.                 if(v9(au,lnumber(h)/result))
  416.                     return true;
  417.             }
  418.         }
  419.     }
  420.     return false;
  421. }

  422. bool v11(int x[],lnumber result)
  423. {
  424.     int u;
  425.     int i,j;
  426.     int N=11;
  427.     int uc,vc;
  428.     int au[11],av[11];
  429.     for(u=(N+1)/2;u<=8;u++){
  430.         int v=N-u;
  431.         for(i=1;i<(1<<N)-1;i++){
  432.             if(bc(i)==v){
  433.                 uc=vc=0;
  434.                 for(j=0;j<N;j++){
  435.                     if(i&(1<<j)){
  436.                         av[vc++]=x[j];
  437.                     }else{
  438.                         au[uc++]=x[j];
  439.                     }
  440.                 }
  441.                 if(verify(av,vc,au,uc,result))
  442.                     return true;
  443.             }
  444.         }
  445.     }
  446.     for(u=0;u<11;u++){
  447.         int h=x[u];
  448.         uc=0;
  449.         for(i=0;i<11;i++){
  450.             if(i!=u){
  451.                 au[uc++]=x[i];
  452.             }
  453.         }
  454.         if(v10(au,result+h))
  455.             return true;
  456.         if(v10(au,result-h))
  457.             return true;
  458.         if(result.is_zero()&&h==0)return true;
  459.         if(h!=0){
  460.             if(v10(au,result*h))
  461.                 return true;
  462.             if(v10(au,result/h))
  463.                 return true;
  464.             if(!result.is_zero()){
  465.                 if(v10(au,lnumber(h)/result))
  466.                     return true;
  467.             }
  468.         }
  469.                 int u2;
  470.                 for(u2=u+1;u2<11;u2++){
  471.                         int hc=5,h2=x[u2];
  472.                         number hh[5];
  473.                         hh[0]=h+h2;hh[1]=abs(h-h2);hh[2]=h*h2;hh[3]=number(h,h2);hh[4]=number(h2,h);
  474.                         for(int k=0;k<5;k++){
  475.                                 uc=0;
  476.                                 for(i=0;i<11;i++){
  477.                                         if(i!=u&&i!=u2){
  478.                                                 au[uc++]=x[i];
  479.                                         }
  480.                                 }
  481.                                 if(v9(au,result+hh[k]))
  482.                                         return true;
  483.                                 if(v9(au,result-hh[k]))
  484.                                         return true;
  485.                                 if(result.is_zero()&&hh[k].is_zero())return true;
  486.                                 if(!hh[k].is_zero()){
  487.                                         if(v9(au,result*hh[k]))
  488.                                                 return true;
  489.                                         if(v9(au,result/hh[k]))
  490.                                                 return true;
  491.                                         if(!result.is_zero()){
  492.                                                 if(v9(au,lnumber(hh[k])/result))
  493.                                                         return true;
  494.                                         }
  495.                                 }
  496.                         }
  497.                 }
  498.     }
  499.     return false;
  500. }

  501. bool u9(int x[],const number& r, int size)
  502. {
  503.         int i,j;
  504.         int y[9];
  505.         for(i=0;i<(1<<9)-1;i++){
  506.                 if(bc(i)>=size){
  507.                         int c;
  508.                         for(j=0,c=0;j<9;j++){
  509.                                 if(i&(1<<j)){
  510.                                         y[c++]=x[j];
  511.                                 }
  512.                         }
  513.                         if(vs(y,c,r))
  514.                                 return true;
  515.                 }
  516.         }
  517.         return false;
  518. }

  519. bool u10(int x[],const number& r, int size)
  520. {
  521.         int i,j;
  522.         int y[10];
  523.         for(i=0;i<(1<<10)-1;i++){
  524.                 if(bc(i)>=size){
  525.                         int c;
  526.                         for(j=0,c=0;j<10;j++){
  527.                                 if(i&(1<<j)){
  528.                                         y[c++]=x[j];
  529.                                 }
  530.                         }
  531.                         if(c<9){
  532.                                 if(vs(y,c,r))
  533.                                         return true;
  534.                         }else if(c==9){
  535.                                 if(v9(y,r))
  536.                                         return true;
  537.                         }
  538.                 }
  539.         }
  540.         return false;
  541. }

  542. bool u11(int x[], const number& r, int size)
  543. {
  544.         int i,j;
  545.         int y[11];
  546.         for(i=0;i<(1<<11)-1;i++){
  547.                 if(bc(i)>=size){
  548.                         int c;
  549.                         for(j=0,c=0;j<11;j++){
  550.                                 if(i&(1<<j)){
  551.                                         y[c++]=x[j];
  552.                                 }
  553.                         }
  554.                         if(c<9){
  555.                                 if(vs(y,c,r))
  556.                                         return true;
  557.                         }else if(c==9){
  558.                                 if(v9(y,r))
  559.                                         return true;
  560.                         }else if(c==10){
  561.                                 if(v10(y,r))
  562.                                         return true;
  563.                         }
  564.                 }
  565.         }
  566.         return false;
  567. }

  568. ///Now comes code for N=9
  569. int _tmain(int argc, _TCHAR* argv[])
  570. {
  571.     int x;
  572.     int i,j;
  573.     int u[12]={1,2,3,4,5,6,7,8,9,10,11,12};
  574.     if(v9(u,lnumber(38103))){
  575.         fprintf(stderr,"Fail for test 9\n");
  576.     }
  577.         fprintf(stderr,"Finish test 9\n");
  578.     if(v10(u,lnumber(231051))){
  579.         fprintf(stderr,"Fail for test 10\n");
  580.     }
  581.         fprintf(stderr,"Finish test 10\n");
  582. /*        if(u9(u,number(38103),5)){
  583.                 fprintf(stderr,"Fail for subdata of 9\n");
  584.         }
  585. */        if(u10(u,number(231051),6)){
  586.                 fprintf(stderr,"Fail for subdata of 10\n");
  587.         }
  588.         fprintf(stderr,"End of test 10\n");
  589.         if(v11(u,lnumber(1765186))){
  590.         fprintf(stderr,"Fail for test 11\n");
  591.         }
  592.         fprintf(stderr,"end for test 11\n");
  593.         if(u11(u,number(1765186),7)){
  594.                 fprintf(stderr,"Fail for subdata of 11\n");
  595.         }
  596.         fprintf(stderr,"End of test\n");
  597.         return 0;
  598. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-9 08:15:04 | 显示全部楼层
我觉得有点慢
=====================
用二分是否好呢?
使用不同分划数量的两组整数
逐步递归产生结果?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-9 08:16:43 | 显示全部楼层
比如11的
先考虑1个10个的分划
10个的再分划

因为有总目标存在
所以应该比原始题目快的多
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-9 09:18:36 | 显示全部楼层
我已经按你说的做了.这个已经比原始题目快很多了.原始题目如果采用+,-,*,/所有的操作符,最多只能计算到N=10(好像需要2天左右时间)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-9 09:30:55 | 显示全部楼层


明白你如何做的了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-5 11:54:00 | 显示全部楼层
昨天N=12的情况验证通过了。不过程序运行多长时间忘记了,估计在一到两周之间。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-19 09:59 , Processed in 0.042882 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表