打印

送10分,求最佳算法。

[复制链接]
25539|187
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 刘前辈 于 2011-5-5 16:14 编辑

有下面结构STRUC_a [ ] 这么一组数,现在要求把中间5个0删掉,用后面3组数前移补充,也就是最后结果成了1,2,3,0,0,4,5,6,0,0,7,8,9,1,0,1,3,5,0,0,2,4,6,0,0,2,4,6,0,0,3,5,7,0,0,

idata  struct
{
char  arr1[5];
}STRUC_a [ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};

有几种算法?哪个是最佳?也就是 code 最小,data  最少。


、、
评分
参与人数 1威望 +1 收起 理由
dlmchb + 1

相关帖子

沙发
yewuyi| | 2011-5-5 16:16 | 只看该作者
不好意思啊,没看懂题目,你自己好好看看,题目对吗?

使用特权

评论回复
板凳
ayb_ice| | 2011-5-5 16:30 | 只看该作者
我也没有看懂

使用特权

评论回复
地板
ZYP82| | 2011-5-5 16:43 | 只看该作者
我也没看懂

使用特权

评论回复
5
刘前辈|  楼主 | 2011-5-5 16:54 | 只看该作者
等我显示证明一下,题目是对的。就是1,2,3……在内存里显示01,02,03……

、、

使用特权

评论回复
6
yewuyi| | 2011-5-5 16:58 | 只看该作者
等我显示证明一下,题目是对的。就是1,2,3……在内存里显示01,02,03……

、、
刘前辈 发表于 2011-5-5 16:54


更加看不懂!!!

说的神马?

使用特权

评论回复
7
123jj| | 2011-5-5 17:05 | 只看该作者
友情帮顶,俺也学学C语言,搞一个~~~ :lol

-----------------------------------------------------------------------------------------------

创建目标 '目标 1'
编译 Text2.c ...
连接 ...
Program Size: data=50.0 xdata=0 code=284
创建 HEX 文件 "333" ...
"333" - 0 个错误, 0 个警告。

-----------------------------------------------------------------------------------------------

idata  struct
{ char  arr1[5];
}STRUC_a[ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
// 输出---->{{1,2,3},{4,5,6},{7,8,9,1},{1,3,5},{2,4,6},  {2,4,6},{3,5,7}};

void main(void)
{ char n;
  char *p1, *p2;
  p1=(char*)(&(STRUC_a[2].arr1[0])), p2=(char*)(&(STRUC_a[3].arr1[0]));
  for ( n=15; n>0; n--)
    { *p1++ = *p2++;
        }
}

使用特权

评论回复
8
刘前辈|  楼主 | 2011-5-5 17:06 | 只看该作者

RE: 送10分,求最佳算法。

本帖最后由 刘前辈 于 2011-5-5 17:18 编辑

挺清楚的。

怎么贴不了图了?——添加附件总是出来个窗口挡着。

使用特权

评论回复
9
123jj| | 2011-5-5 17:09 | 只看该作者
空函数是

-----------------------------------------------------------------------------------------------

创建目标 '目标 1'
编译 Text2.c ...
连接 ...
Program Size: data=44.0 xdata=0 code=183
创建 HEX 文件 "333" ...
"333" - 0 个错误, 0 个警告。

-----------------------------------------------------------------------------------------------

idata  struct
{ char  arr1[5];
}STRUC_a[ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
// 输出---->{{1,2,3},{4,5,6},{7,8,9,1},{1,3,5},{2,4,6},  {2,4,6},{3,5,7}};

void main(void)
{ ;
}

使用特权

评论回复
10
123jj| | 2011-5-5 17:10 | 只看该作者
多用了 data=50-44=6 ,   code=284-183=101

楼下请继续~~~ :P

使用特权

评论回复
11
123jj| | 2011-5-5 17:19 | 只看该作者
再优化一下~~~
-----------------------------------------------------------------------------------------------

创建目标 '目标 1'
编译 Text2.c ...
连接 ...
Program Size: data=47.0 xdata=0 code=246
创建 HEX 文件 "333" ...
"333" - 0 个错误, 0 个警告。

-----------------------------------------------------------------------------------------------

idata  struct
{ char  arr1[5];
}STRUC_a[ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
// 输出---->{{1,2,3},{4,5,6},{7,8,9,1},{1,3,5},{2,4,6},  {2,4,6},{3,5,7}};

void main(void)
{ unsigned char n;
  char idata *p1, *p2;
  p1=(char*)(&(STRUC_a[2].arr1[0])), p2=(char*)(&(STRUC_a[3].arr1[0]));
  for ( n=15; n>0; n--)
    { *p1++ = *p2++;
        }
}

使用特权

评论回复
12
123jj| | 2011-5-5 17:20 | 只看该作者
多用了 data=47-44=3 ,   code=246-183=63

楼下请继续~~~ :P

使用特权

评论回复
13
123jj| | 2011-5-5 17:34 | 只看该作者

使用特权

评论回复
14
刘前辈|  楼主 | 2011-5-5 17:41 | 只看该作者
123jj就看懂了。正是这个意思。

可惜我贴不了图了。以前能贴。还是网站的问题?各位能贴吗?

我用的data=46.0   code=255

先感谢123jj,从你的程序学到不少东西。最提个意见:你的程序需要自己数被移动的个数,所以不能作为库函数通用。——例如结构长度不是5的时候,还要改程序?C是做模块复用的,我能不能在任何情况下调用你的函数?例如有100组数据,每组27字节,我总不能用27*X来决定移动元素字节数?

、、

使用特权

评论回复
15
cubasa| | 2011-5-5 17:41 | 只看该作者
我这样理解不知道对不对:
原始数组结构变量:
a [ ]={{1,2,3},{4,5,6},{0,0,0,0},{7,8,9,1},{1,3,5},{2,4,6},{3,5,7}};
要求:
去掉中间全零的{0,0,0,0},然后其他补足5个成员(char  arr1[5]),输出:
{1,2,3,0,0},{4,5,6,0,0},{7,8,9,1,0},{1,3,5,0,0},{2,4,6,0,0},{2,4,6,0,0},{3,5,7,0,0},

如果是这样,
1. 倒数第二个{2,4,6,0,0}不知从何而来~云里雾里。
2. “中间5个0”在哪里?

使用特权

评论回复
16
刘前辈|  楼主 | 2011-5-5 17:52 | 只看该作者
123jj结论正确。理解力高。敬佩。

回15楼,倒数第二个(2,4,6,0,0}结构初始化的时候就在那了。注意移动后数组长度并未改变,倒数第二个数如若不是{2,4,6,0,0}应该是什么?

、、

使用特权

评论回复
17
刘前辈|  楼主 | 2011-5-5 17:57 | 只看该作者
13楼的图怎么贴的,教教俺。

俺现在“高级回复——添加附件”总出来那个“文件尺寸小于5M……”窗口挡着;——以前这窗口位置在“添加附件”上方;不会是俺17"显示器太小的缘故?


、、

使用特权

评论回复
18
cubasa| | 2011-5-5 18:12 | 只看该作者
原来如此,我也理解了。

使用特权

评论回复
19
刘前辈|  楼主 | 2011-5-5 18:16 | 只看该作者
为何123jj的程序修改一下就没有正确结果了?

for ( n=5; n>0; n--)
    { *p1++ = *p2++;
        }

、、

使用特权

评论回复
20
icecut| | 2011-5-5 20:03 | 只看该作者
本帖最后由 icecut 于 2011-5-5 20:12 编辑

老大,你白占了个好名字.连个问题都描述不清楚

这题目应该让以前的某位大侠给你解答.很容易.
单片机不建议这么玩.浪费字节.
并且前面的算法不通用.都知道第三个是0了.还有什么可玩的?

初始化数组的时候就把他扔了算了.
其次用单片机去做这个,没什么可玩的.算法很死.也没听icache也没有dcache.
纯算法,你也不通用,没法算

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:做自己所热爱的,并热爱自己所做的。

24

主题

1038

帖子

4

粉丝