免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gaochang2008
打印 上一主题 下一主题

[算法] 不简单的strlen长度计算, [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-05-13 14:17 |只看该作者
原帖由 思一克 于 2009-5-13 14:13 发表
最快的,也不用额外变量的:

int strlen(char *s)
{
    return strchr(s, '\0') - s;
}

这个很赞啊,满足题意兼顾效率,有点取巧就是了

论坛徽章:
0
32 [报告]
发表于 2009-05-13 14:20 |只看该作者
原帖由 daybreakcx 于 2009-5-13 14:17 发表

这个很赞啊,满足题意兼顾效率,有点取巧就是了


满足题目要求。又没有递归。
递归求这个是百倍千倍地浪费空间和时间,比如求一个几千字节长的串。

论坛徽章:
0
33 [报告]
发表于 2009-05-13 14:25 |只看该作者
原帖由 皇家救星 于 2009-5-12 22:38 发表

int strlen(char *p)  // 注意! 不允许定义任何变量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}


当p指向最后的'\0'时, return 0, 再之后怎么算的? 我不明白strlen(p+1)出栈之后为什么能算出数啊?

论坛徽章:
0
34 [报告]
发表于 2009-05-13 14:52 |只看该作者
学过函数式编程的人就能很方便写出这个程序了。

这也就是函数式编程和过程式编程的区别了,不是用变量来保存状态的

论坛徽章:
0
35 [报告]
发表于 2009-05-13 17:11 |只看该作者
to xinglp :

  你的方法其实和定义一个变量记录*p为空时位置没啥区别;况且它的要求是在一个函数内实现,却不想你竟然另写了一个函数,汗。。。

[ 本帖最后由 BillStone 于 2009-5-13 17:13 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
36 [报告]
发表于 2009-05-13 17:23 |只看该作者
to BillStone  

论坛徽章:
0
37 [报告]
发表于 2009-05-13 17:24 |只看该作者
用穷举法

  1. size_t strlen(const char *s)
  2. {
  3.         if(s[0]==0)
  4.             return 0;
  5.     if(s[1]==0)
  6.             return 1;  
  7.     if(s[2]==0)
  8.             return 2;
  9.     if(s[3]==0)
  10.             return 3;
  11.     ...
  12.     if(s[0xffffffff]==0)
  13.             return 0xfffffffe;
  14. }
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
38 [报告]
发表于 2009-05-13 17:30 |只看该作者
其实很多地方都能避免使用strlen(),因为很多时候字符串的头和尾都能知道,能用strcpy(),就避免使用strcat()

论坛徽章:
0
39 [报告]
发表于 2009-05-13 17:35 |只看该作者
我第一直觉也是用两个地址相减, 但是实在是没想好如何保存首地址。把题改下吧, 不能定义变量, 不能调用库函数, 不能递归, 不能另加函数, 不能做么? 应该也能做, 还有强人继续放招么?:)

论坛徽章:
0
40 [报告]
发表于 2009-05-13 17:45 |只看该作者
int strlen(char *p)
{
    return (printf ("%s", p));
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP