PTA | 个位数统计


题目:

给定一个 k 位整数 N=dk−1​10k−1+⋯+d1​101+d0​ (0≤di​≤9, i=0,⋯,k−1, dk−1​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。

输入格式:

每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。

输出格式:

对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。

输入样例:

100311

输出样例:

0:2
1:3
3:1

代码长度限制16 KB,时间限制400 ms,内存限制64 MB,栈限制8192 KB

代码:

C++ (clang++)

有注释版:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	string s;
	cin>>s;
	map<char,int> mp;
	for(int i=0;i<s.size();i++){
		mp[s[i]]++;
	}
	for(auto i:mp){
		cout<<i.first<<":"<<i.second<<"\n";
	}
}
有注释版:
#include<bits/stdc++.h>   // 引入头文件,包含所有标准库
using namespace std;      // 使用标准命名空间

#define int long long      // 将int类型定义为long long,以支持更大的数字

signed main() {           // 主函数
    string s;             // 用来存储输入的数字字符串
    cin >> s;             // 输入数字字符串(字符串形式,以便按字符处理)

    map<char, int> mp;    // 使用map容器来存储每个字符出现的次数,key是字符,value是字符出现的次数
    for (int i = 0; i < s.size(); i++) {  // 遍历字符串中的每个字符
        mp[s[i]]++;       // 每出现一个字符,map中对应字符的值加1
    }

    // 遍历map,输出每个字符及其出现次数
    for (auto i : mp) {  // auto i 使得我们不必显式地指定迭代器类型
        cout << i.first << ":" << i.second << "\n";  // 输出字符(数字)和它的出现次数
    }
}
<think>嗯,用户想找关于PTA平台上用C++实现个位数统计的代码和解题思路。首先,我需要回忆一下PTA的相关题目,可能是指统计一个整数中各个位数的出现次数。比如题目可能给出一个很大的数,比如100311,然后要输出每个数字出现的次数,比如0出现2次,1出现3次,3出现1次。 根据用户提供的引用,特别是引用2、3、4,里面提到了C++的解决方案,其中使用字符串处理可能更方便。因为输入的数字可能非常大,超过整数类型的范围,所以用字符串处理更合适。比如引用3中的代码用了string类,然后遍历每个字符,将字符转换为数字索引,统计到数组中。 用户可能需要具体的步骤和代码示例。首先,解题思路应该是这样的:将输入作为字符串处理,遍历每个字符,将字符转换为数字(比如s[i] - '0'),然后对应的计数器数组增加。最后遍历计数器数组,输出非零的统计结果。 需要注意的细节包括:输入可能包含前导零吗?根据题目描述,应该不需要,因为输入是给定的整数,但实际处理时应该按照字符串原样处理。例如引用4提到输入格式是k位整数,可能高位可能有前导零?或者题目中说明dk-1>0,所以最高位非零,但输入可能是一个字符串,需要处理所有字符。 另外,代码实现方面,C++中可以用cin读取字符串,然后初始化一个大小为10的数组,初始化为0。然后循环每个字符,将字符转为数字,对应数组位置加一。最后循环数组,输出次数不为零的结果。 用户可能遇到的问题包括如何处理字符到数字的转换,比如忘记减去'0'导致ASCII码的问题,如引用3中提到必须减去'0'才能得到正确的数字值。另外,测试用例可能有边界情况,比如所有数字相同,或者输入只有一位数,比如引用5提到输入是两个个位数的情况需要注意。 因此,在回答时应该强调字符串处理的必要性,转换字符为数字的方法,以及如何处理各种边界情况。同时,给出代码示例,并解释关键步骤,比如数组初始化、遍历字符串、输出格式等。</think>### PTA个位数统计C++实现方法 #### 解题思路 1. **输入处理**:由于输入数字可能超过整型范围(例如$10^{1000}$),直接使用字符串存储更高效[^2][^4]。 2. **统计逻辑**: - 初始化长度为10的数组`count[10]`,对应数字$0$到$9$的计数器。 - 遍历字符串每个字符,将其转换为数字$d_i$(通过`字符 - '0'`实现),对应计数器$count[d_i]$自增[^3][^4]。 3. **输出结果**:遍历`count`数组,仅输出出现次数大于$0$的数字及其次数。 #### 代码实现 ```cpp #include <iostream> #include <string> using namespace std; int main() { string num; int count[10] = {0}; // 初始化计数器数组 cin >> num; // 输入数字字符串 for (char c : num) { int digit = c - '0'; // 字符转数字(关键步骤) count[digit]++; // 对应计数器自增 } for (int i = 0; i < 10; i++) { if (count[i] > 0) { cout << i << ":" << count[i] << endl; // 输出结果 } } return 0; } ``` #### 注意事项 1. **字符转换**:必须通过`c - '0'`将ASCII字符转换为实际数字,否则会得到错误结果(例如字符`'3'`的ASCII码是$51$)。 2. **边界情况**:输入为单个字符(如`"0"`)或全相同数字时,程序需正确处理[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值