C++代码实现输入一个正整数n(1≤n≤1000),统计从1到n之间(包含1和n)所有正整数中,0,1,2,3,4,5,6,7,8,9的数字分别出现的次数,且按样例分行输出(按0到9顺序输出,英文逗号前为0到9的数字,逗号后为该数字出现的次数)。 例如:n为12,那么1到n之间所有的正整数有1,2,3,4,5,6,7,8,9,10,11,12。 在12个正整数中数字0出现了1次,数字1出现了5次,数字2出现了2次,数字2,3,4,5,6,7,8,9分别出现了1次。
时间: 2023-08-18 16:10:36 浏览: 545
好的,下面是C++代码实现:
```cpp
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入正整数n
// 初始化0到9的数字出现次数为0
int count[10] = {0};
// 统计数字出现次数
for (int i = 1; i <= n; i++) {
int num = i;
while (num) {
count[num % 10]++;
num /= 10;
}
}
// 按样例输出结果
for (int i = 0; i < 10; i++) {
cout << i << " , " << count[i] << endl;
}
return 0;
}
```
输入样例:
```
12
```
输出样例:
```
0 , 1
1 , 5
2 , 2
3 , 1
4 , 1
5 , 1
6 , 1
7 , 1
8 , 1
9 , 1
```
相关问题
给定两个正整数 n 和 k,求从 1到 n 这 n个正整数的十进制表示中 k 出现的次数。 输入格式 共一行,包含两个整数 n和 k。 输出格式 输出一个整数,表示答案。
算法1
暴力枚举每个数字的每一位,统计k出现的次数,时间复杂度为O(n*log_10(n))。
时间复杂度
参考文献
Python 代码
C++ 代码
算法2
统计k在每个数位上出现的次数,并累加得到最终答案。以k=3为例,假设当前处理的是x,x的第i位为di。有以下三种情况:
- di>k,则di可以取0~9中任意一个数字,共10^(i-1)种情况,其中i表示第i位,10^(i-1)表示该数位前(i-1)位共有10^(i-1)种情况。
- di<k,则第i位只能取0~di-1中的数字,如果i=1,则0不能出现,共di*(10^(i-1))种情况。
- di=k,则第i位只能取0~di-1中的数字,共(dk-1)*(10^(i-1)) + x%(10^(i-1))+1种情况,其中x%(10^(i-1))表示当前数位前(i-1)位的数字共有x%(10^(i-1))+1种情况,因为x前(i-1)位的数字可以取0~(x%(10^(i-1)))。
注意到以上三种情况中第一种情况和第二种情况可以合并成一个公式,故最终的公式为:
ans = ∑i=1 ^ len(n)[(n // (10^i))*10^(i-1)+min(max(n%(10^i)−k+1,0),10^(i−1))−(k==0)*10^(i−1)]
其中,n // (10^i)表示取n的前i位数字,max(n%(10^i)−k+1,0)表示取n的第i位数字时,能取到的范围。注意当k=0时,第二项需要减去10^(i-1)。
时间复杂度
参考文献
Python 代码
C++ 代码
算法3
对于每一位数位上出现k的次数进行统计。根据数位的不同分类具体处理,具体如下:
- 如果k=0,则枚举当前数位,次数为n/10^(i+1)*10^i,表示高位上数位1~n/10^(i+1)共可以变化10^i种,其中i表示数位从右数第x位,不包含本位(假设最低位为第0位)上的前缀0。
Python 代码
C++ 代码
- 如果当前位数字是k,则统计方式分为三种:
- 如果该位数字为0,则次数为前面数位(不包括本身)0~n/10^(i+1)的个数
- 如果该位数字不为0,则次数为前面数位(不包括本身)0~n/10^(i+1)的个数+1
- 如果i=0,即当前位为最低位且为k,则次数为1
Python 代码
C++ 代码
- 如果当前位数字小于k,则次数为前面数位(不包括本身)0~n/10^(i+1)的个数
- 如果当前位数字大于k,则次数为前面数位(不包括本身)0~n/10^(i+1)的个数+1
于是有以下代码
时间复杂度
参考文献
Python 代码
C++ 代码
使用C++ 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。 第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。 输出格式 只输出一个整数,即这 N 个数中包含多少对相反数。 样例输入 5 1 2 3 -1 -2 样例输出 2给出代码
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
unordered_map<int, int> numCount;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
numCount[nums[i]]++;
}
int count = 0;
for (int i = 0; i < N; i++) {
int num = nums[i];
if (numCount[-num] > 0) {
count++;
}
}
cout << count << endl;
return 0;
}
```
注意:这段代码是用C++编写的,可以直接运行。它使用了unordered_map来统计每个数出现的次数,并使用vector来保存输入的整数。然后遍历每个数,如果它的相反数也在输入中出现,则相反数对的数量增加。最后输出结果。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)