HDU2072

题目链接
做这道题的时候,被 如何判断后面的单词是否与前面的单词相同 这个问题难住了,后面实在做不出来看了这篇HDU-2072 单词数——底层C语言解法后,顿时清醒了,

原来可以借助结构体数组来存储每个单词,数组的下标 i 就代表第i + 1个单词,再用strcmp函数来判断后面的单词是否与前面的已经存入到结构体数组中的单词相同,不得不感叹,大佬就是大佬哇!!

AC代码:

#include<stdio.h>
#include<string.h>

typedef struct
{
    char str [ 25 ] ;
}arr ;

arr x [ 10000 ] ;
char a [ 10000 ] ;

int main( void )
{
    int i , j , k , len , n , sum , m , flag ;

    while( gets( a ) != NULL )
    {
        if ( strcmp( a , "#" ) == 0 )//#要用“”括起来,代表字符串,而不能使用‘’,否则产生Runtime Error(ACCESS_VIOLATION)
            break ;		//因为strcmp函数比较的是两个字符串

        j = 0 ;//数组a中的下标
        sum = 0 ;//不同的单词数
        n = 0 ; //单词总数
        k = 0 ; //结构体数组中str数组的下标
        len = strlen( a ) ;

        if ( a [ 0 ] >= 'a' && a [ 0 ] <= 'z' )//防止字符串第一个元素是空格
            sum++;
        for ( i = 0 ; i < len ; i++ )
        {
            if ( i == 0 || ( a [ i - 1 ] == ' ' && a [ i ] != ' ' ) )
            {
                j = i ;
                while( 1 )
                {
                    x [ n ].str[ k ] = a[ j ] ;//把单词存入结构体数组中
                    k++ ;   j++ ;

                    if ( a [ j ] == ' ' || j == len )
                    {
                        x [ n ].str[ k ] = '\0' ;//添加字符数组结束标志符
                        k = 0 ;
                        n++ ;
                        break ;
                    }
                }
            if ( n > 1 ) //用来判断是否有相同的单词
            {
                flag = 0 ;
                for( m = 0 ; m < n - 1 ; m++ )
                {
                    if ( strcmp( x[ n - 1 ].str , x[ m ].str ) == 0 )
                    {
                         flag = 1 ;
                         break ;
                    }
                }
                if ( flag == 0 )
                    sum++ ;
            }
        }
    }
        printf( "%d\n" , sum ) ;
    }
    return 0 ;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值