讲讲这段话?

yudun1989 2009-11-07 08:22:41
想用指针解决回文数问题,一个牛人给了下面一段程序。
int r(char *s)
{
char *p=s;
while (*p++);
while (s<--p && *s++==p[-1]);
return s>=p;
}


基本上。。看不懂。。。能不能讲讲
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxdcxp 2009-11-07
  • 打赏
  • 举报
回复
顶四楼
chenzhp 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 febbird1984 的回复:]
int r(char *s) //这里传进来的参数应该是一个字符串的首地址
{
    char *p=s; //将p指向s,也就是字符串的第一個字符的地址
    while (*p++); //循環直到*p=0,也就是'\0'字符結束,是字符串的結尾字符,但是p還是要加1,指向'\0'後面的一個地址
    while (s <--p && *s++==p[-1]);//將p每次減1,也就是從'\0'開始往回退,和s比較.*s++ == p[-1],第一次是比較第一個字符(s)和'\0'前一個字符(p),也就是第一個和倒數第一個非結尾字符比較.這2個表達式如果都為真的話,那麼p會回退1個字符,s會增加1個字符.因此就是比較第n個字符和倒數第n個非'\0'字符是否相同.如果s < --p先為假的話,*s++==p[-1]就執行不到了.那麼s和p此刻要么指向最中間那個字符(奇數個字符的情況),要么s和p是相鄰的字符(偶數的情況),並且s是緊跟p的那個字符,既然比較到這裡了,那麼說明第n個字符和倒數第n個非'\0'字符都是相等的,因此最後返回s>=p是為真.
假如*s++==p[-1]先為假的話,那麼可以知道s肯定還是在p前面的,最壞的情況是:(偶數個字符的話)s和p是最中間的2個字符,並且s在p前面,而且s和p指向的字符不相等;(奇數個字符的話)s和p是最中間那個字符左右的2個字符,s在前,p在后,並且s和p指向的字符不相等.這樣的情況下,s都是在p前面的,也就是s <p,因此返回s>=p為假
    return s>=p;
}
[/Quote]
我的天。太详细了。上帝啊
febbird1984 2009-11-07
  • 打赏
  • 举报
回复
int r(char *s) //这里传进来的参数应该是一个字符串的首地址
{
char *p=s; //将p指向s,也就是字符串的第一個字符的地址
while (*p++); //循環直到*p=0,也就是'\0'字符結束,是字符串的結尾字符,但是p還是要加1,指向'\0'後面的一個地址
while (s <--p && *s++==p[-1]);//將p每次減1,也就是從'\0'開始往回退,和s比較.*s++ == p[-1],第一次是比較第一個字符(s)和'\0'前一個字符(p),也就是第一個和倒數第一個非結尾字符比較.這2個表達式如果都為真的話,那麼p會回退1個字符,s會增加1個字符.因此就是比較第n個字符和倒數第n個非'\0'字符是否相同.如果s < --p先為假的話,*s++==p[-1]就執行不到了.那麼s和p此刻要么指向最中間那個字符(奇數個字符的情況),要么s和p是相鄰的字符(偶數的情況),並且s是緊跟p的那個字符,既然比較到這裡了,那麼說明第n個字符和倒數第n個非'\0'字符都是相等的,因此最後返回s>=p是為真.
假如*s++==p[-1]先為假的話,那麼可以知道s肯定還是在p前面的,最壞的情況是:(偶數個字符的話)s和p是最中間的2個字符,並且s在p前面,而且s和p指向的字符不相等;(奇數個字符的話)s和p是最中間那個字符左右的2個字符,s在前,p在后,並且s和p指向的字符不相等.這樣的情況下,s都是在p前面的,也就是s<p,因此返回s>=p為假
return s>=p;
}
lylm 2009-11-07
  • 打赏
  • 举报
回复
#include <vector>
#include <iostream>
using namespace std;
int r(char *s)
{
char *p=s; //保存开始地址到p
while (*p++); //p移到末尾
while (s <--p && *s++==p[-1]); //依次比较头指针s尾指针p指向的字符,如果相等,s后移,p前移
return s>=p; //如果是回文,s=p,返回1,否则0
}

void main()
{
char str[]="dbcbd";
char str2[]="abcda";
printf("r=%d,r2=%d\n",r(str),r(str2));
}
liao05050075 2009-11-07
  • 打赏
  • 举报
回复

int r(char *s)
{
char *p=s;
while (*p++);//把p指向字符串尾,此时s指向字符串开头
while (s <--p && *s++==p[-1]);//当s<p,同时s和p所指向的字符相同,此时p向回走一步,s向前走一步
return s>=p;//如果s>=p,则s是一个回文
}
你自己写一个例子,手动模仿一下就应该明白了。
要注意到,p[-1]实际上是*(p-1)
昵称很不好取 2009-11-07
  • 打赏
  • 举报
回复

{
char *p=s;
while (*p++); //这里p指向字符串结束处
while (s <--p && *s++==p[-1]); //这里只要s和p前一个字符相等,p就向后倒退一个字符,s前进一个字符
return s>=p; //如果s最后跑到p前面说明是回文,否则不是
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧