- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 41273
- 在线时间
- 小时
|
发表于 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[MAXM]={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 the unsigned char dtype[MAXM];
- int max_available_m;
- void setall() {
- int i,j;
- dtype[1]=MUL;
- for(i=1;i<=PREDEF_VALUE;i++){
- if(i>1&&value[i]==value[i-1]+1){
- dtype[i]|=SUB1;
- }
- for(j=1;j<=i;j++){//MUL
- int k=i*j;int nv=value[i]+value[j];
- if(value[k]==0||nv<value[k]){
- value[k]=nv;dtype[k]=MUL;
- }else if(nv==value[k]){
- dtype[k]|=MUL;
- } k=i+j;
- if(value[k]==0||nv<value[k]){
- value[k]=nv;dtype[k]=ADD;
- }else if(nv==value[k]){
- dtype[k]|=ADD;
- }
- }
- }
- for(i=PREDEF_VALUE+1;i<MAXM;i++){
- int ub=(int)floor(pow(16.0*i,1.0/3.0));
- assert(value[i]>0);
- if(i+ub<=MAXM){
- max_available_m=i;
- for(j=1;j<=ub;j++){
- int nv=value[i+j]+value[j];
- if(nv<value[i]){
- value[i]=nv;dtype[i]=j<6?SUB1:SUBM;
- }else if(nv==value[i]){
- dtype[i]|=j<6?SUB1:SUBM;
- }
- }
- }
- for(j=1;j<=i&&j<=(MAXM-1)/i;j++){
- int k=i*j;int nv=value[i]+value[j];
- if(value[k]==0||nv<value[k]){
- value[k]=nv;dtype[k]=MUL;
- }else if(nv==value[k]){
- dtype[k]|=MUL;
- }
- }
- ub=2*ub;
- for(j=1;j<=i&&j<=MAXM-1-i&&j<=ub;j++){
- int k=i+j;int nv=value[i]+value[j];
- if(value[k]==0||nv<value[k]){
- value[k]=nv;dtype[k]=ADD;
- }else if(nv==value[k]){
- dtype[k]|=ADD;
- }
- }
- }
- }
- int main() {
- int i;
- setall();
- for(i=1;i<max_available_m;i++){
- printf("value[%d]=%d\n", i,value[i]);
- }
- }
复制代码 |
|