魔法数组生成器:根据二进制位划分数字
魔法数组生成器:根据二进制位划分数字
本文介绍一个有趣的算法问题:魔法数组生成器。该算法接受一个正整数 nums 作为输入,并生成一系列“魔法数组”。每个魔法数组都包含一组数字,这些数字的二进制表示中,'1' 出现在相同的位置。
例如,输入 nums = 5,生成的魔法数组如下:
- 第1个魔法数组: 1, 3, 5* 第2个魔法数组: 2, 3
Python 实现
以下 Python 代码实现了魔法数组生成器:pythonnums = int(input())lis = [[] for i in range(10)]for i in range(1, nums + 1): l_i = str(bin(i)) for j, k in zip(l_i[::-1][:-2], range(1000)): # print(j, k, i) if j == '1': lis[k].append(i)# print(lis)times = 1for i in lis: if i: zhi = 1 print() if times != 1 else None print(f'第{times}个魔法数组') for j in i: print('{:>5}'.format(j), end='') zhi += 1 if zhi > 4: print() zhi = 1 times += 1 print() else: break
C++ 实现
以下是等效的 C++ 代码:cpp#include
int main() { int nums; cin >> nums;
vector<vector<int>> lis(10);
for (int i = 1; i <= nums; i++) { string l_i = bitset<32>(i).to_string(); l_i = l_i.substr(l_i.find('1'));
for (int j = l_i.length() - 1, k = 0; j >= 0; j--, k++) { if (l_i[j] == '1') { lis[k].push_back(i); } } }
int times = 1; for (vector<int>& i : lis) { if (!i.empty()) { int zhi = 1; if (times != 1) { cout << endl; } cout << '第' << times << '个魔法数组' << endl; for (int j : i) { cout << '{:>5}' << j; zhi++; if (zhi > 4) { cout << endl; zhi = 1; } } times++; cout << endl; } else { break; } }
return 0;}
这段 C++ 代码使用了 vector 容器来存储生成的魔法数组,并将整数转换为二进制字符串后提取出其中的 '1',最后根据规则将对应的数字存储在相应的魔法数组中。
总结
本文介绍了如何使用 Python 和 C++ 实现魔法数组生成器。该算法简单易懂,但可以应用于各种场景,例如数据分组和模式识别。
原文地址: http://www.cveoy.top/t/topic/cF9t 著作权归作者所有。请勿转载和采集!