day7 homework

This commit is contained in:
flykhan 2023-06-21 11:31:26 +08:00
parent 300c745459
commit 690d495f38
10 changed files with 312 additions and 0 deletions

24
day7/homework/h11.cpp Normal file
View File

@ -0,0 +1,24 @@
// 使用位运算符实现以下条件:判断一个数的二进制表示中有多少个 1
// 例如:输入 5输出 2 : 5 的二进制表示为 101其中有 2 个 1
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
int n;
cout << "请输入一个整数: ";
cin >> n;
int cnt = 0; // 计数器
while (n)
{
if (n & 1)
cnt++; // 如果 n 的最后一位是 1计数器加 1
n >>= 1; // n 右移一位
}
cout << "二进制表示中有 " << cnt << " 个 1" << endl;
return 0;
}

27
day7/homework/h12.cpp Normal file
View File

@ -0,0 +1,27 @@
// 输入一个数,如果它是质数,输出 "Yes",否则输出 "No"。
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "请输入一个整数: ";
cin >> n;
int i = 2;
while (i * i <= n)
{
if (n % i == 0)
{
cout << "No" << endl;
return 0;
}
else
i++;
}
cout << "Yes" << endl;
return 0;
}

19
day7/homework/h13.cpp Normal file
View File

@ -0,0 +1,19 @@
// 将一个数的二进制表示中所有的 1 都变成 0所有的 0 都变成 1
#include <iostream>
#include <bitset>
#include <climits>
using namespace std;
int main()
{
int n;
cout << "请输入一个整数: ";
cin >> n;
cout << "原本的二进制表示为: " << bitset<32>(n) << endl;
cout << "UINT_MAX 的二进制表示为: " << bitset<32>(UINT_MAX) << endl;
cout << "取反后的二进制表示为: " << bitset<32>(n ^ UINT_MAX) << endl;
return 0;
}

24
day7/homework/h14.cpp Normal file
View File

@ -0,0 +1,24 @@
// 输入一个数,判断它是否为回文数,即正着读和倒着读都一样
#include <iostream>
using namespace std;
int main()
{
int n, temp, res;
cout << "请输入一个数:";
cin >> n;
temp = n; // 拷贝一份 n
res = 0;
// 原理:将 n 从个位开始取出,然后乘以 10 加到 res 中
for (; temp > 0; temp /= 10)
res = res * 10 + temp % 10;
if (res == n)
cout << "是回文数" << endl;
else
cout << "不是回文数" << endl;
return 0;
}

28
day7/homework/h15.cpp Normal file
View File

@ -0,0 +1,28 @@
// 使用位运算符实现以下条件:将一个数的二进制表示中从第 n 位(从右往左数)开始的 m 位翻转。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
int x;
cout << "请输入一个整数: ";
cin >> x;
cout << "原来的二进制表示为: " << bitset<32>(x) << endl;
int n, m;
cout << "请输入要翻转的起始位: ";
cin >> n;
cout << "请输入要翻转的位数: ";
cin >> m;
while (m--)
{
x ^= (1 << n);
n++;
}
cout << "翻转后的二进制表示为: " << bitset<32>(x) << endl;
return 0;
}

33
day7/homework/h16.cpp Normal file
View File

@ -0,0 +1,33 @@
// 输入一个数,输出它的二进制表示。
#include <iostream>
using namespace std;
int main()
{
char arr[32] = {};
char res[32] = {};
int n, temp_n;
int cnt = 0;
cout << "请输入一个整数: ";
cin >> n;
temp_n = n;
int x;
cout << "请输入要转换的进制 (十以内): ";
cin >> x;
while (n)
{
arr[cnt++] = n % x + '0'; // 将数字转换为字符; 加 48 也可以, 因为 '0' 的 ASCII 码为 48
n /= x; // 除以 2
}
// cout << "原本的进制表示为:" << arr << endl;
// 数组逆转
for (int i = 0; i < cnt; i++)
res[i] = arr[cnt - i - 1];
cout << "十进制数字 " << temp_n << "" << x << " 进制表示为:" << res << endl;
return 0;
}

37
day7/homework/h17.cpp Normal file
View File

@ -0,0 +1,37 @@
// 将一个数的二进制表示中从第 n 位(从右往左数)开始的 m 位设为另一个数的二进制表示的最后 m 位。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
int num1, num2, n, m;
cout << "请输入两个整数: ";
cin >> num1 >> num2;
cout << "请输入起始位n和位数m: ";
cin >> n >> m;
cout << "开始的 num1 二进制为: " << bitset<32>(num1) << endl;
cout << "开始的 num2 二进制为: " << bitset<32>(num2) << endl;
// 对 num1 进行预处理
int mask = (1 << m) - 1; // 生成 m 位全 1 的掩码
int mask_2 = mask; //一份 mask 拷贝, 用于后续处理 num2
mask = mask << n; // mask 左移 n 位
mask = ~mask; // mask 掩码按位取反
num1 &= mask; // 将 num1 从第 n 位开始 (从右向左) 的 m 位重置为 0
cout << "预处理后 num1 二进制为: " << bitset<32>(num1) << endl;
// 对 num2 进行预处理
num2 &= mask_2; // 保留 num2 的后 m 位, 其余位重置为0
num2 = num2 << n; // num2 再向左移位 n
cout << "预处理后 num2 二进制为: " << bitset<32>(num2) << endl;
// 将处理后的 num1 和 num2 相或
num1 |= num2;
cout << "处理后的 num1 二进制为: " << bitset<32>(num1) << endl;
return 0;
}

30
day7/homework/h18.cpp Normal file
View File

@ -0,0 +1,30 @@
// 输入一个数,输出它的平方根
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "请输入一个整数: ";
cin >> x;
int left = 0, right = x;
int mid;
while (left <= right)
{
int mid = (left + right) / 2;
if (mid * mid == x)
{
cout << x << " 的平方根为: " << mid << endl;
return 0;
}
else if (mid * mid < x)
left = mid + 1;
else
right = mid - 1;
}
cout << x << " 找不到平方根" << endl;
return 0;
}

28
day7/homework/h19.cpp Normal file
View File

@ -0,0 +1,28 @@
// 将一个数的二进制表示中从第 n 位(从右往左数)开始的 m 位设为 0。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
int x;
cout << "请输入一个整数: ";
cin >> x;
cout << "原来的二进制表示为: " << bitset<32>(x) << endl;
int n, m;
cout << "请输入第 n 位(从右往左数): ";
cin >> n;
cout << "请输入要设为 0 的位数: ";
cin >> m;
while (m--)
{
x &= ~(1 << n);
n++;
}
cout << "设为 0 后的二进制表示为: " << bitset<32>(x) << endl;
return 0;
}

62
day7/homework/h20.cpp Normal file
View File

@ -0,0 +1,62 @@
// 输入一个数,输出它的绝对值。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
// 位运算方法
int x;
cout << "请输入一个整数: ";
cin >> x;
cout << x << " 的二进制表示为: " << bitset<32>(x) << endl;
int mask = x >> 31;
cout << "mask: " << bitset<32>(mask) << "\t mask 的 int 值为: " << (int)mask << endl; // m
cout << "x + mask: " << bitset<32>(x + mask) << "\t x + mask 的 int 值为: " << (int)(x + mask) << endl; // x + m
cout << "(x + mask) ^ mask: " << bitset<32>((x + mask) ^ mask) << endl; // (x + m) ^ m = x + m ^ m = x + 0 = x
cout << cout << x << " 的绝对值为: " << ((x + mask) ^ mask) << endl;
return 0;
// 三目运算符方法
// int x;
// cout << "请输入一个整数: ";
// cin >> x;
// cout << x << " 的绝对值为: " << (x > 0 ? x : -x) << endl;
// return 0;
// if-else 方法
// int x;
// cout << "请输入一个整数: ";
// cin >> x;
// if (x > 0)
// cout << x << " 的绝对值为: " << x << endl;
// else
// cout << x << " 的绝对值为: " << -x << endl;
// return 0;
// switch-case 方法
// int x;
// cout << "请输入一个整数: ";
// cin >> x;
// switch (x > 0)
// {
// case 1:
// cout << x << " 的绝对值为: " << x << endl;
// break;
// case 0:
// cout << x << " 的绝对值为: " << -x << endl;
// break;
// }
// return 0;
}