一、题目

http://acm.wust.edu.cn/problem.php?id=1185&soj=0

二、分析

  1. 统计的是不同的单词数,即重复的单词只统计一次;
  2. 多组输入;
  3. 每行不超过1000个字符,可用一维数组读取;
  4. 输入‘#’表示结束;
  5. 文章只有小写字母和空格组成。

三、思路

用article读取整行字符串,然后依次判断每个字符,并将它们按照单词存到paper中,全部放入后,将paper的第一维,按照字符串(a-z)排序,最后在paper中,依次比较相邻的单词,相同则跳过,不同则单词数numOfWordsNoRepeat加1,最后输出单词数,并换行。

补充说明:

输入以下数据:

  a  ac  ax  a  s z ax
#
article
    a     a c     a x     a     s   z   a x     \0  
排序前paper
a \0                                                
a c \0                                              
a x \0                                              
a \0                                                
s \0                                                
z \0                                                
a x \0                                              
排序后paper
a \0                                                
a \0                                                
a c \0                                              
a x \0                                              
a x \0                                              
s \0                                                
z \0                                                

结果有5个单词。

四、代码

#include<stdio.h>
#include<string.h> // strcmp函数
#include<stdlib.h> // qsort函数
#define MAX_CHAR 1001 // 一行最大字符数
int main() {
char article[MAX_CHAR], paper[MAX_CHAR][40]; // 保存文章
int i, j, theWordSubscript, newWord, numOfWordsNoRepeat;
while (gets(article) && article[0] != '#') {
theWordSubscript = -1; // 最初没有单词,初始化下标为-1
newWord = 1; // 是否是新单词,1是新单词,0不是新单词
for (i = 0; article[i] != '\0'; i++) {
if (article[i] == ' ') { // 下标为i的字符是空格
newWord = 1; // 下个字符是新单词的首字符,newWord置1
}
else {
if (newWord == 1) { // 当前字符是新单词的首字符
theWordSubscript++; // 单词下标加1
newWord = j = 0; // 接下来的不是新单词,newWord置0;j重置为第一个字符
}
paper[theWordSubscript][j++] = article[i]; // 复制当前字符到二维数组中,j自增
paper[theWordSubscript][j] = '\0'; // 末尾赋值为结束符,表示字符串(当前单词)结束
}
}
if (theWordSubscript > 0) { // 单词数(包含重复的)大于1的话,将所有单词排序a-z
qsort(paper, theWordSubscript + 1, sizeof(char) * 40, strcmp); // 排序函数
}
if (theWordSubscript >= 0) { // 至少有一个单词的话,输出数据,否则输出
numOfWordsNoRepeat = 1; // 单词数初始化为1
for (i = 0; i < theWordSubscript; i++) { // 统计不重复单词数
if (strcmp(paper[i], paper[i + 1]) != 0) { // 不重复,单词数加1
numOfWordsNoRepeat++;
}
}
printf("%d\n", numOfWordsNoRepeat); // 输出单词数
}
}
return 0;
}

五、截图

1185: 零起点学算法92——单词数(C)的更多相关文章

  1. Problem B: 零起点学算法92——元素前移1位

    #include<stdio.h> int main() { ],b[]; while(scanf("%d",&n)!=EOF) { ;i<n;i++) ...

  2. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 293 ...

  3. 1147: 零起点学算法54——Fibonacc

    1147: 零起点学算法54--Fibonacc Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 20 ...

  4. 1133: 零起点学算法40——多组测试数据(a+b)II

    1133: 零起点学算法40--多组测试数据(a+b)II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitte ...

  5. 1101: 零起点学算法08——简单的输入和计算(a+b)

    1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitt ...

  6. 1179: 零起点学算法86——小明A+B(未弄懂)

    1179: 零起点学算法86——小明A+B Time Limit: 1 Sec  Memory Limit: 32 MB   64bit IO Format: %lldSubmitted: 2540  ...

  7. 1164: 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  8. 1163: 零起点学算法70——Yes,I can!

    1163: 零起点学算法70--Yes,I can! Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

  9. 1137: 零起点学算法44——多组测试数据输出II

    1137: 零起点学算法44--多组测试数据输出II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

随机推荐

  1. Leet Code 1.两数之和

    给定一个整数nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 可以假设每种输入只会对应一个答案.但是,不能重复利用这个数组中同样的元素. 题解 提交代 ...

  2. grep awk 查看nginx日志中所有访问的ip并 去重

    111.225.78.157 - - [13/Aug/2019:16:03:08 +0800] "POST /api/login HTTP/1.1" 200 249 "h ...

  3. 关于PHP中token的生成的解析

    背景 很多时候我们需要用 token 来作为一些标识, 比如: 一个用户登录后的认证标识. 实现方式 md5 的方式: $v = 1; // 自己定义的 需要hash 的value 值 $key = ...

  4. Oracle基本操作 ora-01031 insufficient privileges

  5. 网络通信技术中的中继器repeater

    1. repeater的作用 对信号进行再生和还原 2. repeater的优点 延长通讯距离 提高可靠性 增加节点的最大数目 各个网段可以使用不同的通讯速率 3. repeater的缺点 增加了延时 ...

  6. 完美解决Cannot download "https://github.com/sass/node-sass/releases/download/binding.nod的问题

    ①:例如很多人第一步就会这样做: 出现:Cannot download "https://github.com/sass/node-sass/releases/download/版本号/XX ...

  7. VAE论文学习

    intractable棘手的,难处理的  posterior distributions后验分布 directed probabilistic有向概率 approximate inference近似推 ...

  8. asp设置cookies过期时间

    Response.Cookies("user_name").Expires=Date+1 '指定cookie保存时间 保留COOKIES一个小时 Response.Cookies( ...

  9. 复习sql server 2000 MSDE2000 ,安装,打补丁,开1433端口。

    前言: 由于工作需要,一个仍在使用的古董软件需要安装配置. 原有系统是在主机部署,单机安装sql2000,其他机器(分机)也单机部署软件,部署sql2000,通过dtsrun /f sync.dts( ...

  10. Golang中的Map(集合)

    Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它.不过,Map 是无 ...