1022 D进制的A+B

1022 D进制的A+B (20 分)

输入两个非负 10 进制整数 A 和 B (≤2​30​​−1),输出 A+B 的 D (1<D≤10)进制数。

输入格式:

输入在一行中依次给出 3 个整数 A、B 和 D。

输出格式:

输出 A+B 的 D 进制数。

输入样例:

123 456 8

输出样例:

1103

解题之前先了解一下“除基取余法”,

/*
做题思路:
首先计算A+B的值
“除基取余法”是一个十进制数转化为D进制数的方法
若十进制数为C,需要转化为D进制数,C/D,最后的余数是转换后的D进制数的最低位,
C=C/D;继续取余数,一直到C=0时结束
*/

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
   int a,b,c,d;
   int s[100],i=0;
   scanf("%d%d%d",&a,&b,&d);
   c=a+b;
  do
   {
       s[i++]=c%d;
       c=c/d;
   } while(c!=0);
   for(int j=i-1;j>=0;j--)
   printf("%d",s[j]); 
    return 0;
}
可能我真的不是一个细心的人,上一秒for循环里用j,下一秒就手残写成i,检查的时候2遍才找出错误来!

 现在根本不敢碰甲级的题,乙级的题就已经很折磨我了,希望有个小天使救救我 

明天好好看书吧,今晚睡前最后一句,要给自己打个气^_^

 

```markdown ### 题目重述 这是一段 C++ 代码片段,要求填写缺失的代码部分(标记为①~⑤)。 **选择题:** 35. ①处应填(  )。 A. `x = n` B. `x = 1` C. `x = 0` D. `x = n - 1` 36. ②处应填(  )。 A. `--cnt` B. `++cnt` C. `cnt--` D. `cnt` 37. ③处应填(  )。 A. `x /= 2` B. `n++` C. `x++` D. `n--` 38. ④处应填(  )。 A. `i < cnt` B. `i < cnt / 2` C. `i <= cnt` D. `i <= cnt / 2` 39. ⑤处应填(  )。 A. `sum--` B. `sum = x` C. `sum = 0` D. `sum++` --- ### 答案 35. **A. x = n** 36. **D. cnt** 37. **A. x /= 2** 38. **C. i <= cnt** 39. **D. sum++** --- ### 代码概述 这段代码的功能是: - 输入一个整数 `n` - 将其转换为 **二进制**,并记录每一位(从低位到高位)存储在数组 `a[1..cnt]` 中 - 然后统计其中 **值为 1 的位数**,即将 `sum` 赋值为二进制中 1 的个数 - 最终输出这个个数 --- ### 代码解析 #### 变量说明: - `a[33]`:用于存储二进制位(最多 32 位) - `cnt`:记录二进制位数 - `n`:输入的整数 - `x`:中间变量,用于处理 `n` 的二进制转换 - `sum`:统计二进制中 1 的个数 #### 逐空解析: ##### **35. ①:初始化 `x`** 代码在读取 `n` 后,要开始处理它的二进制表示。 正确做法是将 `x` 初始化为 `n`,然后进行除以 2 的操作,取出每一位的余数。 ✅ 所以应填:**A. `x = n`** --- ##### **36. ②:记录每一位二进制的位置** 在 `while(x > 0)` 循环中,我们依次取出 `x` 的二进制位,并存入数组 `a`。 ```cpp a[②] = x % 2; ``` 此时 `cnt` 应该是当前是第几位(从高位或低位开始),且每次递增。 由于二进制是从低位到高位依次取的(例如 `6 -> 110`,依次取 0、1、1),因此 `cnt` 应该从 1 开始递增。 所以 `a[cnt] = x % 2;`,之后 `cnt++` ✅ 所以应填:**D. cnt** --- ##### **37. ③:更新 x** 每次取完最低位后,要将 `x` 右移一位,即 `x /= 2` ✅ 所以应填:**A. x /= 2** --- ##### **38. ④:遍历所有二进制位** 最后遍历 `a[1..cnt]`,统计其中值为 1 的个数。 循环应该从 `i=1` 到 `i<=cnt`,包含所有记录的位。 ✅ 所以应填:**C. i <= cnt** --- ##### **39. ⑤:统计 1 的个数** 当 `a[i] == 1` 时,`sum` 加 1 ✅ 所以应填:**D. sum++** --- ### 完整代码(填空后) ```cpp #include <bits/stdc++.h> using namespace std; int a[33], cnt; int main() { int n, sum, x; cin >> n; cnt = 0; x = n; // 35. 填 A while (x > 0) { a[cnt] = x % 2; // 36. 填 D x /= 2; // 37. 填 A } sum = 0; for (int i = 1; i <= cnt; i++) // 38. 填 C if (a[i] == 1) sum++; // 39. 填 D cout << sum << endl; return 0; } ``` --- ### 知识点 1. **整数的二进制表示** 使用 `x % 2` 和 `x /= 2` 可以依次取出每一位的二进制数字。 2. **循环与数组索引控制** 使用 `cnt` 控制数组下标,确保每一位都被正确记录。 3. **统计二进制中 1 的个数** 遍历数组并判断每一位是否为 1,统计总数。 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值