| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1134 人关注过本帖
标题:测试回文,感觉写的好复杂
取消只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:20 回复次数:7 
测试回文,感觉写的好复杂
main() 用来测试的,不用去管。

程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>


int
palindrome( char *string );

int
main( void )
{
    char s1[10000];
    int i;
    int ch;
    FILE *fp;

    if( NULL == ( fp = fopen( "word.txt","r" ) ) )
    {
        fprintf( stderr, "Error\n" );
        exit( EXIT_FAILURE );
    }

    for( i = 0; 10000 - 1 > i && EOF != ( ch = fgetc( fp ) ); i++ )
        s1[ i ] = ch;
    s1[ i ] = '\0';

    while( 'y' == ( ch = getchar() ) )
    {
        while( '\n' != getchar() )
            ;
        if( 1 == ( i = palindrome( s1 ) ) )
            printf( "Yes\n" );
        else if( -1 == i )
            printf( "Error\n" );
        else
            printf( "No\n" );
    }

    fclose( fp );

    getchar();

    return 0;
}


void
reverse( char *src );
enum { Error = -1, No = 0, Yes = 1};


int
palindrome( char *string )
{
    char *s1, *s2;
    char temp[ strlen( string ) ];//VS或VC这一行可能通不过编译。
    int CharAmount;
    int Limit;
    int i;


    if( 0 ==  strlen( string ) )
        return Error;


    for( CharAmount = 0, i = 0; '\0' != *string; string++ )
        if( isalpha( *string ) )
        {
            temp[ i++ ] = tolower( *string );
            CharAmount++;
        }
    temp[ i ] ='\0';


    Limit = CharAmount / 2;
    s1 = ( char * )malloc( ( Limit + 1 ) * sizeof( char ) );
    s2 = ( char * )malloc( ( Limit + 1 ) * sizeof( char ) );
    if( NULL == s1 || NULL == s2 )
        return Error;


    strncpy( s1, temp, Limit );
    *( s1 + Limit ) = '\0';

    if( CharAmount % 2)
        strncpy( s2, temp + Limit + 1, Limit );
    else
        strncpy( s2, temp + Limit, Limit );
    *( s2 + Limit ) = '\0';
    reverse( s2 );

    i = strcmp( s1, s2 );
    free( s1 );
    free( s2 );

    if( 0 == i )
        return Yes;
    else
        return No;
}


void
reverse( char *src )
{
    char *s1, *s2;
    char temp;

    s1 = src;
    s2 = src;

    while( '\0' != *s2 )
        s2++;
    s2--;

    for( ; s1 < s2; s1++, s2-- )
    {
        temp = *s1;
        *s1 = *s2;
        *s2 = temp;
    }
}


[此贴子已经被作者于2017-3-13 15:41编辑过]

2017-03-13 15:35
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 ehszt
用你的代码考虑下:Madam, I'm Adam

PS:写代码能不能标准点儿。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 吹水佬
考虑下我回复2楼的那个字符串。那是最经典的回文,用二楼的代码无法判断。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:36
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 3楼 九转星河
我写的那个main()是用来测试的,不用在意。
那个while我自己拿来看有没有内存泄漏。

但是的确有一点,没有人可以判断用户将输入多少个字符。

[此贴子已经被作者于2017-3-13 16:46编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 ehszt
回文本来就是这样的啊,忽略标点,忽略大小写。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:43
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 10楼 ehszt
递归会实实在在的消耗空间。

例如,你考虑一下用递归计算非波那契数列,计算F30。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:48
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 12楼 ehszt
计算F30,F3会重复计算31W次。而这31W次,每一次都会占用内存。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 16:55
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 14楼 ehszt
你做一个很简单的测试。

递归打印数字。
想函数传递一个数字,让该函数递归打印,每次递减1.

递归N次,就会占用N×sizeof( XXX )个字节的内存.



[此贴子已经被作者于2017-3-13 17:04编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-13 17:02
快速回复:测试回文,感觉写的好复杂
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026701 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved