第九周OJ(1)统计字符个数

本文介绍了一个简单的C语言程序,用于统计输入字符串中英文字符、数字、空格和其他字符的数量,并展示了程序代码及其运行结果。

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

烟台大学计算机与控制工程学院
All rights reserved.
作者:汪莹莉
完成时间:2016年10月30日
题目描述:

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

sample  input:

              aklsjflj123 sadf91u32oasdf/.' ;123

sample  output

23 16 3 4

/*

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char c;
   int n=0,i=0,m=0,b=0;
   while((c=getchar())!='\n')
   {
       if ((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
        n++;
      else if(c>='0'&&c<='9')
        i++;
       else if(c==' ')
        b++;
       else
        m++;
   }
       printf("%d %d %d %d\n",n,i,b,m);
    return 0;
}

运行结果:

知识点总结:了解到各个字母及数字的·ASCII值,A:65  a:97 空格:32

学习心得:字符变量;char c;while((c=getchar())!='\n')表示逐步输入




<think>好的,我现在需要帮助用户解决如何使用Java实现L1-003题目的个位数统计功能。首先,我得仔细看一下题目要求。题目是给定一个k位整数N,统计每个个位数字出现的次数。例如输入100311输出0出现2次,1出现3次,3出现1次。 根据用户提供的引用内容,特别是引用[3],里面有一个Java代码示例。用户可能希望得到类似的解决方案。我需要确保自己理解代码的结构和逻辑。代码中,用户将输入转换为字符数组,然后统计每个字符对应的数字出现的次数,最后输出结果。 首先,我应该考虑输入的处理。因为输入的整数可能非常大,超过普通整数类型的范围,所以直接将其作为字符串处理会更安全。这样就不用担心数值溢出问题。比如,用户输入可能是一个很长的数字字符串,用字符串处理可以逐个字符检查。 接下来,统计次数的方法。可以使用一个长度10的整数数组,索引0到9分别对应数字0到9的出现次数。遍历字符串中的每个字符,将字符转换为数字(例如,字符'5'转换为5),然后对应的数组位置加1。 然后,输出结果时需要遍历这个数组,只输出出现次数大于0的数字及其次数。例如,如果数组索引3的位置是1,那么输出3:1。 现在,我需要考虑代码的具体实现。用户提供的引用[3]中的代码使用了Scanner和PrintWriter,这可能是因为在Java中处理输入输出时效率的考虑。不过,使用标准的System.in和System.out对于一般的题目应该也足够了,但要注意可能存在的性能问题。不过,根据题目的输入规模,可能不需要特别优化。 另外,代码中使用了char数组,将每个字符转换为数字。这里需要注意的是,字符'0'到'9'的ASCII码是连续的,所以减去'0'可以得到对应的数值。例如,'0'的ASCII码是48,减去48得到0,'1'是49,得到1,以此类推。 接下来,可能要考虑输入的正确性。题目中提到输入一个k位整数,且dk−1>0,即第一个字符不能是0。不过,题目可能保证输入是合法的,所以代码中可能不需要额外的校验,直接处理即可。 现在,总结步骤: 1. 读取输入字符串。 2. 初始化一个长度10的整型数组,初始值全为0。 3. 遍历字符串的每个字符,转换为数字,并增加对应的数组元素。 4. 遍历数组,输出出现次数不为0的数字及其次数。 然后,将这些步骤转化为Java代码。需要注意的是,当输入可能很大时,使用字符串处理更合适。例如,用户输入可能类似于"100311",直接转为字符数组处理。 现在,检查用户提供的引用中的代码是否有需要注意的地方。例如,在引用[3]中,代码使用了Scanner和PrintWriter,这可能是因为在OJ系统中,使用PrintWriter可以提高输出效率。同时,代码中将输入字符串转为字符数组,遍历每个字符,然后统计次数。 可能需要注意的地方是异常处理,但题目可能保证输入合法,所以可以省略。另外,代码中的数组大小为10+10,可能没有必要,只需要10个元素即可,不过后面的索引可能不会用到,不影响结果。 现在,编写代码的大致结构: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); int[] cnt = new int[10]; for (char c : s.toCharArray()) { int num = c - '0'; cnt[num]++; } for (int i = 0; i < 10; i++) { if (cnt[i] > 0) { System.out.printf("%d:%d\n", i, cnt[i]); } } } } 这样应该可以实现功能。但需要考虑是否有前导零的情况。根据题目描述,输入的N是一个k位整数,且dk−1>0,所以输入字符串的第一个字符不会是0,所以在统计的时候,数字0的出现次数可能来自中间或末尾的字符,比如示例中的100311,两个0是在中间和末尾的位置。 所以代码不需要处理前导零的问题,因为输入本身不会出现前导零。 另外,测试用例是否正确。例如输入100311输出是否正确?代码会遍历每个字符统计0、1、3的出现次数。是的。 现在,用户的问题是如何用Java完成这个功能,所以需要给出详细的步骤解释,并确保代码正确。 可能还需要处理输入中的其他问题,比如是否会有非数字字符?题目中说明输入的是k位整数,所以应该只有数字字符,因此代码不需要处理其他字符的情况。 总结,解决方案是正确的,可以按照上述步骤实现。</think>### 分步解答 #### 1. 输入处理 由于输入的整数可能非常大(例如超过`Long`类型的范围),应当**直接读取为字符串**处理,避免数值溢出问题。例如: ```java Scanner sc = new Scanner(System.in); String number = sc.next(); // 读取输入数字字符串 ``` #### 2. 统计数字频率 使用**长度10的整型数组**存储0-9数字的出现次数。遍历字符串中的每个字符,将字符转换为数字后更新对应索引的计数值: ```java int[] count = new int[10]; for (char c : number.toCharArray()) { int digit = c - '0'; // 字符'0'-'9'转换为数字0-9 count[digit]++; } ``` #### 3. 输出结果 遍历统计数组,按格式输出出现次数大于0的数字及其频次: ```java for (int i = 0; i < 10; i++) { if (count[i] > 0) { System.out.printf("%d:%d\n", i, count[i]); } } ``` ### 完整代码实现 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String number = sc.next(); int[] count = new int[10]; for (char c : number.toCharArray()) { int digit = c - '0'; count[digit]++; } for (int i = 0; i < 10; i++) { if (count[i] > 0) { System.out.printf("%d:%d\n", i, count[i]); } } } } ``` ### 关键点说明 1. **字符转换原理**:通过`c - '0'`将字符转换为对应的整数值,例如字符`'5'`的ASCII码为53,减去`'0'`的ASCII码48后得到整数5[^3]。 2. **时间复杂度**:算法的时间复杂度为$O(k)$,其中$k$是输入数字的位数,效率较高。 3. **适用性**:该方法适用于任意长度的整数统计,避免了数值类型限制问题[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值