hujunhua 发表于 2015-6-19 17:29:16

正在计算到317。
---------------------------------------------------------------------------------
悲剧呀,下班了回去让程序继续跑,晚上9点钟来看,已经跑完了,应该是生成了一个巨量的一维表mw,内存占用为40%(运行前为17%)。
然后写一个语句,将表输出到一个txt文件,监视显示内存占用很快上升到98%,一会就跳出一个提示:

然后就看到内存占用直线下垮到11%(开启M10之前的水平),一会就回到了17%,所有的变量都恢复成了蓝色(未定义、未赋值的状态)。
可怜我还没有让那个mw 显屏看一眼呢:'(

裴进兵 发表于 2015-6-19 23:26:46

hujunhua 发表于 2015-6-19 09:47
这个不正确。a(n+d)=a(n)±a(d)的情况,有d>1的情况。
在10000以内,至少d=2的情况我们知道比比皆是,虽 ...

我可以理解为,后面减1或者减3,是可以相互转化的,对吧

hujunhua 发表于 2015-6-20 00:51:03

比如,79可以四种分解式
1)79=78+1=2·3·13+1=2·3·(3·4+1)+1,a(79)=2+3+3+4+1+1=14
2)79=81-2=34-2, a(79)=3·4+2=14
3)由2)转化:79=34-2=34-3+1=3(33-1)+1, a(79)=3+3·3+1+1=14.
4)79=80-1=5·24-1, a(79)=5+2·4+1=14.

hujunhua 发表于 2015-6-20 01:34:17

@ 裴进兵
在316以内搜索{2,3,5,7}的组合压缩点,结果全都是5和7的组合压缩点,不干2,3的事。共以下6个:

1)   54·7=4375
2 )    56=15625
3)   52·74=60025=60024+1=3·82·244+1=3·(34+1)·(35+1)+1, a(60025)=33, 而2a(5)+4a(7)=34.
4)   5·77=4117715
5)   53·76=14706125
6)   79=40353607

其中5的压缩点56和7的压缩点79在关于b(n)的文献上看到过。

裴进兵 发表于 2015-6-20 23:50:45

裴进兵 发表于 2015-6-19 23:26
我可以理解为,后面减1或者减3,是可以相互转化的,对吧

我明白了,谢谢,诚挚的感谢!

裴进兵 发表于 2015-6-20 23:51:59

hujunhua 发表于 2015-6-20 00:51
比如,79可以四种分解式
1)79=78+1=2*3*13+1=2*3*(3*4+1)+1,a(79)=2+3+3+4+1+1=14
2)79=81-2=3^4-2, a ...

明白,一目了然,谢谢,非常感谢!

mathe 发表于 2015-6-23 09:56:28

计算到226左右最大k值57(64071257)

mathe 发表于 2015-6-23 10:00:53

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#define MAXM (1<<26) //max to 2^26
#define PREDEF_VALUE 32
#define MUL       1
#define ADD       2
#define SUB1      4
#define SUBM      8
unsigned short value={0,1, 2, 3, 4, 5, 5, 6, 6, 6, 7, 8, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, 10, 10, 9, 10, 10, 9, 10, 11, 10, 11, 10};//provide theunsigned char dtype;
int max_available_m;
void setall() {
   int i,j;
   dtype=MUL;
   for(i=1;i<=PREDEF_VALUE;i++){
          if(i>1&&value==value+1){
               dtype|=SUB1;
          }
          for(j=1;j<=i;j++){//MUL
             int k=i*j;int nv=value+value;
             if(value==0||nv<value){
                  value=nv;dtype=MUL;
             }else if(nv==value){
                  dtype|=MUL;
             }             k=i+j;
             if(value==0||nv<value){
                  value=nv;dtype=ADD;
             }else if(nv==value){
                  dtype|=ADD;
             }
          }
   }
   for(i=PREDEF_VALUE+1;i<MAXM;i++){
          int ub=(int)floor(pow(16.0*i,1.0/3.0));
          assert(value>0);
          if(i+ub<=MAXM){
          max_available_m=i;
          for(j=1;j<=ub;j++){
               int nv=value+value;
               if(nv<value){
                   value=nv;dtype=j<6?SUB1:SUBM;
               }else if(nv==value){
                   dtype|=j<6?SUB1:SUBM;
               }
          }
   }
          for(j=1;j<=i&&j<=(MAXM-1)/i;j++){
               int k=i*j;int nv=value+value;
               if(value==0||nv<value){
                   value=nv;dtype=MUL;
               }else if(nv==value){
                   dtype|=MUL;
               }
          }
          ub=2*ub;
          for(j=1;j<=i&&j<=MAXM-1-i&&j<=ub;j++){
               int k=i+j;int nv=value+value;
               if(value==0||nv<value){
                  value=nv;dtype=ADD;
               }else if(nv==value){
                  dtype|=ADD;
               }
          }
   }
}
int main() {
   int i;
   setall();
   for(i=1;i<max_available_m;i++){
         printf("value[%d]=%d\n", i,value);
   }
}

裴进兵 发表于 2015-6-23 23:49:33

n-1, n, n+1三个数中必然有一个3倍数,一到两个偶数,这样用加减1来调整成2、3倍数,分解完之后,数字和是不是最小呢?

hujunhua 发表于 2015-6-24 20:50:07

文献中提到了分解树——用图来表达四则分解的方法。树的中间结点都是乘号或者加号,树的叶结点就是数字1(可带负号)。
实际绘制树图时有所简化:
1、最底层的加号结点用它所含1的数量来代替,其下的多个叶结点1则省略了。这步简并后,新的叶结点就是数字1,2,3等。
2、乘号结点下的多个相同叶结点缩并为一个叶结点,在连结线上标示幂次。
如下 两例:

分解树显示了分解式的层次结构。
页: 1 2 [3] 4 5 6
查看完整版本: 我自己琢磨的,恳请大家帮忙论证·