- C++
备战CSP-J初赛21天打卡计划。第一天-练习题答案。
- 2024-8-31 10:29:19 @
DAY1-二进制
快问快答 题目数量 X 2
1、D 2、B
历年真题
1-5:AABDD
6-10:BBACA
11:B
进制转换
1、程序阅读题
1-6:BBADBD
选择题:
2-7:CCADDD
位运算
1、程序阅读题
16-21:ABBBBB
2单选题:
2-3:BD
1 条评论
-
mrhowe SU @ 2024-8-31 14:38:56
进制转换 程序阅读题解析:
#include <iostream> using namespace std; long long n, ans; int k, len; long long d[1000000]; int main() { cin >> n >> k; // 读取输入的n和k d[0] = 0; // 初始化第一个位置的数字为0 len = 1; // 初始化长度为1 ans = 0; // 初始化进位次数为0 for (long long i = 0; i < n; ++i) { ++d[0]; // 每次循环将第一个位置的数字加1 for (int j = 0; j + 1 < len; ++j) { if (d[j] == k) { // 如果某个位置的数字达到k d[j] = 0; // 将该位置的数字重置为0 d[j + 1] += 1; // 下一个位置的数字加1 ++ans; // 进位次数加1 } } if (d[len - 1] == k) { // 如果最高位的数字达到k d[len - 1] = 0; // 将最高位的数字重置为0 d[len] = 1; // 新增一个位置,数字为1 ++len; // 长度加1 ++ans; // 进位次数加1 } } cout << ans << endl; // 输出总的进位次数 return 0; }
这段代码的主要功能是计算在处理一系列数字时,需要进行多少次进位操作。具体来说,代码模拟了一个进位系统,其中每个位置上的数字最大为
k-1
,当某个位置上的数字达到k
时,就会发生进位。详细步骤
- 输入读取:
cin >> n >> k;
:读取输入的n
和k
。n
表示要处理的数字个数,k
表示每个位置上的数字最大值。
- 初始化:
d[0] = 0;
:初始化第一个位置的数字为0。len = 1;
:初始化长度为1。ans = 0;
:初始化进位次数为0。
- 处理数字:
- 使用一个
for
循环处理n
个数字。 ++d[0];
:每次循环将第一个位置的数字加1。- 使用一个嵌套的
for
循环检查每个位置的数字是否达到k
。if (d[j] == k)
:如果某个位置的数字达到k
,则进行进位操作。d[j] = 0;
:将该位置的数字重置为0。d[j + 1] += 1;
:下一个位置的数字加1。++ans;
:进位次数加1。
if (d[len - 1] == k)
:如果最高位的数字达到k
,则进行进位操作。d[len - 1] = 0;
:将最高位的数字重置为0。d[len] = 1;
:新增一个位置,数字为1。++len;
:长度加1。++ans;
:进位次数加1。
- 使用一个
- 输出结果:
cout << ans << endl;
:输出总的进位次数。
示例输入输出
输入:
复制
5 3
输出:
复制
2
总结
这段代码通过模拟进位系统,计算在处理
n
个数字时需要进行多少次进位操作。时间复杂度为O(n * len),其中len
是进位系统的长度。 - 输入读取:
- 1