- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12785
- 在线时间
- 小时
|
发表于 2008-3-7 17:40:28
|
显示全部楼层
按照上面的思路,重写编写程序,15秒可解除 4220074组解(不打出每组解)。
to 18#, 能否举个反例?
代码如下:- #include "stdafx.h"
- #include "math.h"
-
-
- int maxN=256;
- double maxN_r= 1/256.00;
- int max_level=16; //共有7115组解
- //int max_level=16;
- int count=0;
-
- void printfArr(int arr[],int len)
- {
- #ifdef _DEBUG
- for (int i=0;i<len-1;i++)
- {
- printf("1/%d +",arr[i]);
- }
- printf("1/%d =1\n",arr[len-1]);
- #endif
-
- }
-
- bool check(int arr[],int len)
- {
- int n=arr[len-1];
- bool ret=true;
- for (int i=0;i<len-1;i++)
- {
- if (n % arr[i] !=0)
- {
- ret=false;
- break;
- }
- }
- return ret;
- }
-
-
-
-
- void search(int arr[], int level, double rem)
- {
- int i;
- double newRem;
-
- if (level==0)
- {
- for (i=2;i<=maxN;i++)
- {
- arr[level]=i;
- newRem= 1- 1.0 /(double)i;
- search(arr,level+1,newRem);
- }
- }
- else if (level<max_level-1)
- {
- if ( rem * arr[level-1] - 1e-12 > max_level-level)
- {
- return;
-
- }
- else if ( rem * maxN + 1e-12 < 1)
- {
- return;
- }
-
-
- int from= (int)(ceil(1.0/rem));
- if ( from<arr[level-1])
- from =arr[level-1];
-
- for (i=from;i<=maxN;i++)
- {
- arr[level]=i;
- newRem= rem - 1.0 /(double)i;
- search(arr,level+1,newRem);
- }
-
- }
- else if (level==max_level-1) //level+1个数
- {
- int from= (int)(ceil(1.0/rem));
- if ( from<=maxN && from>=arr[level-1] && fabs( 1/(double)from - rem) <1e-15 )
- {
-
- arr[level]= from;
- if ( check( arr, max_level) )
- {
- count++;
- printfArr(arr,level+1);
- }
- }
-
- }
- }
-
-
- bool check2(int arr[],int len)
- {
- int n=arr[len-1];
- int s=0;
- for (int i=0;i<len;i++)
- {
- s+= n / arr[i];
- }
- return (s==n);
- }
-
- void search2(int fac[], int facLen, int arr[], int level, double rem,int lastIdx,int n)
- {
- int i;
- double newRem;
-
- if (level==0)
- {
- for (i=0;i<facLen;i++)
- {
- arr[level]=fac[i];
- newRem= 1- 1.0 /(double)(fac[i]);
- search2(fac,facLen,arr,level+1,newRem,i,n);
- }
- }
- else if (level<max_level-1)
- {
-
- if ( rem * arr[level-1] - 1e-12 > max_level-level)
- {
- return;
-
- }
- else if ( rem * fac[facLen-1] + 1e-12 < 1)
- {
- return;
- }
-
- for (i=lastIdx;i< facLen;i++)
- {
- arr[level]=fac[i];
- newRem= rem - 1.0 /(double)(fac[i]);
- search2(fac,facLen,arr,level+1,newRem,i,n);
- }
- }
- else if (level== max_level-1)
- {
- arr[level]=n;
- level++;
- rem-= 1.0/(double)n;
-
- if ( check2( arr, level) && fabs(rem)<1e-15 )
- {
- count++;
- printfArr(arr,level);
- }
-
- }
-
- }
-
-
- int getFacNums(int n, int arr[])
- {
- int c=0;
- for (int i=2;i<=n; i++)
- {
- if (n % i==0)
- {
- arr[c]=i;
- c++;
- }
- }
- return c;
- }
-
- void test2()
- {
- int i;
- int fac[256];
- int arr[16];
- int c;
-
- for (i=max_level;i<=256;i++)
- {
- c= getFacNums(i,fac);
- search2(fac, c, arr, 0, 1.0, 0,i);
- }
- }
-
- int main(int argc, char* argv[])
- {
- int arr[16];
- count=0;
- //search(arr,0,1.0);
- test2();
- printf("总共 %d 组解\n",count);
- return 0;
- }
复制代码 |
|