C++数组十进制转8位二进制功能出错,求修复方案
问题分析与修正
核心错误:二进制转换部分的变量冲突与数组索引错误
你输出000000010000000100000001的原因有两个:
- 循环变量重名:二进制转换的内层循环使用了和外层数组索引相同的变量名
i,导致在内层循环中,原本指向数组元素的i被覆盖为位位置值(从7到0)。 - 数组索引误用:位判断时错误地使用了内层循环的
i作为数组下标,访问了数组中未初始化的元素(如a[7]、a[6]等),这些垃圾值的最低位恰好为1,其他位为0,因此重复输出00000001。
修正后的完整代码
#include<iostream> using namespace std; // 修正:仅交换首尾元素(原函数实现的是反转整个数组,不符合需求) void swapfrontback(int a[], int n) { if (n < 2) return; int temp = a[0]; a[0] = a[n - 1]; a[n - 1] = temp; cout << "p' = " << endl; for (int i = 0; i < n; i++) { cout << a[i] << endl; } } int main() { int a[10], i, n; cout << "enter size" << endl; cin >> n; if (n == 0) { cout << "Array is empty!\n"; return 0; // 空数组直接退出,避免后续无效操作 } cout << "p = " << endl; for (i = 0; i < n; i++) { cin >> a[i]; } swapfrontback(a, n); // 凯撒密码 int shift = 0; cout << "input shift: "; cin >> shift; int modulus = 0; cout << "input modulus: "; cin >> modulus; cout << "p''=" << endl; for (i = 0; i < n; i++) { // 优化:加modulus避免负数情况(兼容负数输入场景) a[i] = (a[i] + shift + modulus) % modulus; cout << a[i] << endl; } // 修正后的十进制转8位二进制 cout << "p'''=" << endl; for (i = 0; i < n; i++) { // 用j作为位循环变量,避免与外层数组索引i冲突 for (int j = 7; j >= 0; j--) { // 对当前数组元素a[i]进行位判断 if (a[i] & (1 << j)) cout << '1'; else cout << '0'; } cout << endl; // 每个元素的二进制单独换行,提升可读性 } return 0; }
关键修改点说明
二进制转换部分:
- 将内层循环变量改为
j,彻底避免与外层数组索引i的命名冲突。 - 位判断时明确使用
a[i](当前数组元素)而非a[j],确保访问正确的目标元素。 - 添加换行符,让每个元素的二进制结果单独成行,便于查看核对。
- 将内层循环变量改为
交换首尾元素函数:
- 原函数实现的是反转整个数组,不符合你需求中的"交换数组首尾元素",修改后仅交换第一个和最后一个元素。
- 增加数组长度小于2时的判断,避免无意义的操作。
凯撒密码优化:
- 计算时添加
+ modulus,确保即使a[i] + shift为负数,也能得到正确的模运算结果,提升代码健壮性。
- 计算时添加
测试验证
使用你的测试用例:
- 初始数组:
3,18,25 - 交换首尾后:
25,18,3 - 偏移量8、模数26后:
(25+8)%26=7,(18+8)%26=0,(3+8)%26=11 - 转换为8位二进制:
00000111、00000000、00001011
输出结果将完全符合预期。
内容的提问来源于stack exchange,提问作者user20772188
相关产品推荐
相关产品推荐

