找回密码
 欢迎注册
楼主: 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-11-25 02:08 , Processed in 0.025096 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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