Problem F: 统计出其中英文字母、数字、空格和其他字符的个数

本文介绍了一个C语言程序,用于统计输入字符串中英文字符、数字、空格和其他字符的数量。通过详细解析代码,读者可以理解如何使用条件语句和循环来处理字符分类计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem F: 统计出其中英文字母、数字、空格和其他字符的个数

Time Limit: 1 Sec  Memory Limit: 128 MB

 

Description

输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

Input

一行字符

Output

统计值

Sample Input

aklsjflj123 sadf918u324 asdf91u32oasdf/.';123

Sample Output

23 16 2 4

HINT

参考答案:

#include<stdio.h>
int main()
{
	int str=0,nu=0,space=0,ot=0;
	char ch;
	while((scanf("%c",&ch))!=EOF)
	{
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
		{
			str++;
		}
		else if(ch>='0'&&ch<='9')
			{
			   nu++;  
			}
		else if(ch==' ')
			{
			    space++;
			}
		else
			ot++;
	}
	printf("%d %d %d %d",str,nu,space,ot-1);
	return 0;
}

编程软件及学习视频下载:点击打开链接

 

<think>好的,我现在需要解决用户的问题:输入一串文本,统计现最多的单词个数。输那个最大的现次数。首先,我得仔细理解题目要求。 用户给的样例输入是“This is a test, which is a easy problem.”,输是2。这说明“is”“a”各现两次,所以最大的次数是2。那我的程序需要正确分割单词,并统计每个单词现的次数,最后找到最大值。 首先,我需要考虑如何将输入字符串拆分成单词。这里有几个问题:如何处理标点符号?比如样例中的逗号,可能跟在单词后面。另外,大小写是否区分?比如“This”“this”是否算同一个单词? 根据样例,输入中的“This”首母大写,输统计中“is”现两次。可能样例中的处理是将所有单词转为小写,然后统计。所以可能需要先将所有字符转为小写,这样不同大小写的单词会被视为同一个。 接下来是分割单词的问题。常见的做法是用split()方法,但这样可能无法处理带有标点的情况。比如样例中的“test,”后面的逗号,应该被去掉。所以可能需要用正则表达式来分割,或者将非字符替换为空格,然后分割。 可能的步骤是: 1. 将整个字符串转为小写。 2. 使用正则表达式找所有单词,或者替换非字符空格,再用split分割。 3. 统计每个单词的现次数。 4. 找最大的次数值。 比如,正则表达式可以使用r'\b\w+\b'来匹配单词。或者,将字符串中的非字符替换为空格,然后用split()分割成单词列表。 处理标点符号的时候,需要确保单词前后的标点被去除。例如“test,”变成“test”,“problem.”变成“problem”。 具体步骤可能如下: - 将输入字符串转换为全小写。 - 使用正则表达式找到所有由母组成的单词,忽略标点数字。 或者,替换所有非母的字符空格,然后分割成单词列表。 然后统计可以用典或者collections模块中的Counter类。Counter更方便,因为它可以直接统计频率,并且有most_common()方法可以获取现次数最多的元素。 比如,处理后的单词列表传给Counter,然后取最大的计数值。 那具体如何实现? 举个例子,输入样例处理后得到的单词列表应该是:['this', 'is', 'a', 'test', 'which', 'is', 'a', 'easy', 'problem']。然后统计每个词现的次数:'is''a'各现两次,其他一次。所以最大值是2。 那具体代码应该怎么写? 首先读取输入,比如input_str = input().strip() 然后处理输入字符串。转小写:input_str.lower() 然后用正则表达式找所有单词。可以用re.findall(r'[a-z]+', input_str.lower()),这样会把所有连续的母作为一个单词提取来。但可能有问题,比如如果单词中有撇号,比如“don't”会被分成“don”“t”?这取决于题目要求。但题目中样例可能没有这种情况,所以可能只需要处理纯母的情况。 所以用正则表达式r'[a-z]+',然后使用findall方法得到单词列表。 或者,也可以将输入中的非字符替换为空格,然后用split()分割。比如: clean_str = re.sub(r'[^a-z ]', ' ', input_str.lower()) # 将所有非母的字符替换为空格 words = clean_str.split() # 分割成单词列表 这可能更简单。不过需要考虑多个空格的情况,split()会自动处理。 这两种方法都可以得到正确的单词列表。 然后统计每个单词现的次数。使用collections.Counter: from collections import Counter word_counts = Counter(words) 然后取最大的值,max_count = max(word_counts.values(), default=0) 然后输max_count。 这样整个流程就完成了。 测试样例是否正确? 样例输入处理后的单词列表是:['this', 'is', 'a', 'test', 'which', 'is', 'a', 'easy', 'problem']。Counter统计的话,'is''a'各现两次。max就是2,符合样例输。 那代码的大致结构应该是: import re from collections import Counter s = input().strip().lower() words = re.findall(r'[a-z]+', s) # 或者用替换的方式 # 或者: # s = re.sub(r'[^a-z ]', ' ', s.lower()) # words = s.split() counts = Counter(words) print(counts.most_common(1)[0][1] if words else 0) 或者,如果words为空的话,输0。例如输入字符串的情况。 或者用max函数: max_count = max(counts.values(), default=0) print(max_count) 这样可能更简洁。 所以整个代码可以是: import re from collections import Counter text = input().strip().lower() words = re.findall(r'[a-z]+', text) if not words: print(0) else: counts = Counter(words) print(max(counts.values())) 但需要考虑输入是否为空。比如输入是空字符串,那么输0。 测试一下样例是否正确。是的,输应为2。 那有没有可能错的地方? 比如输入中有连字符或者下划线?比如“hello-world”会被视为两个单词吗?根据正则表达式,是的,因为连字符不属于a-z,所以会被分隔。例如“hello-world”会被拆分成['hello', 'world']。但如果是题目中的要求,可能单词是否包含连字符要看具体情况。但根据样例中的输入,似乎不需要考虑这种情况。题目可能只考虑由母组成的单词,所以当前的处理是正确的。 所以这个方案应该可以解决问题。</think>要统计一段文本中现次数最多的单词的个数,可以按照以下步骤进行: ### 解决思路 1. **转换为小写**:将所有母统一为小写,避免大小写差异影响统计。 2. **提取单词**:使用正则表达式去除标点符号,提取纯母组成的单词。 3. **统计频率**:利用 `Counter` 统计每个单词现的次数。 4. **获取最大值**:从统计结果中找到最大的频率值。 ### 代码实现 ```python import re from collections import Counter text = input().strip().lower() words = re.findall(r'[a-z]+', text) max_count = max(Counter(words).values()) if words else 0 print(max_count) ``` ### 代码解释 1. **输入处理**:`text = input().strip().lower()` 读取输入并转换为小写。 2. **提取单词**:`re.findall(r'[a-z]+', text)` 使用正则表达式匹配连续的母作为单词。 3. **统计与输**:`Counter(words)` 统计词频,`max(...)` 获取最大值,空输入时输 `0`。 例如输入: `This is a test, which is a easy problem.` 程序会提取单词并统计,最终输现次数最多的值 `2`(单词 "is" "a" 各现两次)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值