整数的位数可能各不相同,给定一组整数,请按位数分类统计,输出每种位数的出现次数。用C++
时间: 2023-06-27 21:07:19 浏览: 133
可以使用 `map` 数据结构来实现,将每个整数的位数作为键,出现次数作为值,进行统计和存储。
以下是示例代码:
```c++
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, num;
map<int, int> digitCount; // 用于存储每种位数的出现次数
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num;
int digits = 0;
while (num != 0) {
digits++;
num /= 10;
}
digitCount[digits]++;
}
for (auto it = digitCount.begin(); it != digitCount.end(); it++) {
cout << it->first << "位数:" << it->second << "个" << endl;
}
return 0;
}
```
输入格式为:
```
整数个数
整数1 整数2 ... 整数n
```
输出格式为:
```
x位数:y个
```
其中 x 为位数,y 为该位数出现的次数。
相关问题
整数的位数可能各不相同,给定一组整数,请按位数分类统计,输出每种位数的出现次数。c++
可以使用 unordered_map 来记录每种位数的出现次数,具体代码如下:
```c++
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
vector<int> nums = {123, 4567, 89, 12, 3456, 7890, 1234};
unordered_map<int, int> count;
for (int num : nums) {
int digit = 0;
while (num) {
num /= 10;
digit++;
}
count[digit]++;
}
for (auto& p : count) {
cout << "位数为 " << p.first << " 的整数出现了 " << p.second << " 次" << endl;
}
return 0;
}
```
输出结果为:
```
位数为 1 的整数出现了 2 次
位数为 2 的整数出现了 1 次
位数为 3 的整数出现了 1 次
位数为 4 的整数出现了 2 次
位数为 5 的整数出现了 1 次
```
其中 unordered_map 是 C++11 中提供的一种哈希表,可以快速地进行元素查找和插入。上面的代码中,我们用 count[digit]++ 来统计每种位数的出现次数,如果该位数之前没有出现过,则会自动初始化为 0。
C++实现:给定一正整数,通过对其位数最多进行K次交换操作来找到可能的最大整数
在C++中,你可以采用一种迭代或递归的方式来实现这个功能,通常称为“最大排列”或“最接近最大的数字”。这里是一个简单的递归解决方案:
```cpp
#include <vector>
using namespace std;
// 交换两个整数的函数
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 递归函数,尝试将当前位设为1,然后递归地调整其他位
int maxNumber(int num, int k, vector<int>& digits, int pos = -1) {
if (k == 0 || num >= INT_MAX / 10) return num; // 如果没剩余交换次数或已达到最大值,返回当前数
if (pos == digits.size() - 1) { // 如果已经处理到最后一位
// 检查是否可以将该位设置为1,如果不行,则回溯到上一位
for (int i = pos; i >= 0 && num * 10 + 1 > INT_MAX; --i) {
swap(digits[i], digits[i + 1]);
}
return num * 10 + 1;
}
// 尝试将当前位设为1,然后递归
int result1 = maxNumber(num * 10 + 1, k - 1, digits, pos + 1);
// 不改变当前位,保留原值,递归检查其他位
int result2 = maxNumber(num, k, digits, pos + 1);
return max(result1, result2); // 返回两者之间的较大值
}
// 主函数,输入整数和交换次数,构造并返回结果
int findMaxWithKSwaps(int n, int k) {
vector<int> digits; // 存储数字的每一位
while (n > 0) {
digits.push_back(n % 10);
n /= 10;
}
reverse(digits.begin(), digits.end()); // 将数字从高位到低位
return maxNumber(0, k, digits);
}
```
在这个代码里,我们首先将给定的整数转换为数组,然后反转数组顺序,因为我们要寻找的是最大的数。接着,我们开始递归地尝试将每个位置的数置为1,并减少交换次数。如果在某个时刻没有更多的交换机会或者无法再增加数值而保持合法(不会溢出),则返回当前状态。
阅读全文