(PAT乙级)1017 A除以B(C语言实现)

本文详细介绍了如何通过编程模拟手动除法的过程,并总结了处理特殊情况时的注意事项,例如处理被除数只有一位数的情形及for循环的正确执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:1、i=0的情况和其他时候不一样,可以在循环体之前就单独执行,不需要放到循环体里做判断语句。

           2、模拟手动除法的过程,每次用第一位去除以B,如果得到的商不是0就输出,否则就*10+下一位,直到最后的数为余数。                    即每得到一位商都直接输出,不需要存在数组里在统一输出,因为这样既麻烦又容易出错。  

           3、有一个测试用例很刁钻的是:a字符数组只有1位,所以第一位除以b即使为0也要输出,所以判断是否输出第一位的商的                    判断条件应该有两个:①当字符数组长度大于1位且商不等于0;②字符数组只有1位。    

           4、我一直搞混了for循环的执行顺序,赋予初始值后应该先进行判断是否满足条件才能执行循环体,即:

                 如for循环 如下:

for(int i=0;i<10;i++)

{

    循环体

}

执行顺序是:

  1. i=0  初始化初值

  2. i<10 进行判断,如果条件为真,则继续执行

  3. 执行循环体代码

  4. i++ 变量i自增

  5. 回到第2步,一直循环下去,直到第2步为假, 退出循环.

 

 

### 关于PAT乙级1017题的C语言解法 #### 题目概述 题目要求计算两个大整数相除的结果,其中被除数`A`是一个可能非常大的正整数字符串表示形式,而除数`B`则为一个小于等于10的一位正整数。输出应包括商和余数。 #### 解决方案分析 为了处理这个问题,可以逐位读取被除数并累积到当前部分数值中直到该值大于等于除数为止,在此过程中记录下每次完整的除法操作产生的商以及最后剩余的部分作为最终余数[^3]。 #### 实现细节 - 使用字符数组存储输入的大整数`A`以便能够方便地按位访问每一位数字。 - 初始化变量用于保存临时累加器(`tmp`)、商(`Q`)、余数(`R`)等必要状态量。 - 循环遍历整个字符串中的每一个有效数字字符,并将其转换成对应的十进制数值加入到`tmp`之中。 - 当`tmp`达到或超过给定的除数`B`时执行一次正式的除法运算更新相应的输出结果并向前进一位继续上述过程直至完成全部数据处理工作。 - 特殊情况考虑:如果最开始遇到的情况是单个数字小于除数,则直接给出零作商加上这个单独的小数本身做为余数返回即可。 以下是具体的代码实现: ```cpp #include <iostream> #include <cstring> using namespace std; int main() { char A[1000]; int B; cin >> A >> B; // 处理特殊情况:当A仅有一位且小于B的情况下 if (A[0] - '0' < B && strlen(A) == 1) { cout << "0 " << A[0]; return 0; } int Q = 0, R = 0, i = 0; while (A[i] >= '0' && A[i] <= '9') { int tmp = A[i] - '0' + 10 * R; if (tmp >= B) { cout << tmp / B; R = tmp % B; // 如果不是第一位才打印前面可能出现的0 if (i != 0) { cout << 0; } } else { R = tmp; } ++i; } // 输出最后一个空格后的余数 cout << " " << R; return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值