PAT 1017 A除以B

题目:

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。

输入格式:

输入在一行中依次给出 A 和 B,中间以 1 空格分隔。

输出格式:

在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

思路:

  1. 读题抽象:输入一个超大整数A(最多1000位),一个整数B,输出A➗B的商和余数。
  2. 由于A有1000位,long long也存不下(long long最大只有19位)
  3. 模拟手工竖式除法,逐位计算。
  4. 发现每一步都是余数×10+下一位数字,再除以B
  5. 注意:需要去前导零!

代码:

复制代码
#include <stdio.h>
#include <string.h>

#define MAXN 1010

char a[MAXN];           /* 被除数 A 的字符串形式 */
int ans[MAXN];          /* 商的每一位 */
int len = 0;            /* 商的位数 */

int main() {
    int b;              /* 除数 B */
    scanf("%s %d", a, &b);

    int r = 0;          /* 余数,初始为0 */
    int alen = strlen(a);

    /* 高精度除法:逐位处理 */
    for (int i = 0; i < alen; ++i) {
        int digit = a[i] - '0';     /* 当前位数字 */
        int num = r * 10 + digit;   /* 余数*10 + 当前位 = 新的被除数 */

        if (len > 0 || num / b > 0) {   /* 商的前导零不保存 */
            ans[len++] = num / b;        /* 保存商的当前位 */
        }
        r = num % b;                     /* 更新余数 */
    }

    /* 输出商 */
    if (len == 0) printf("0");          /* 商为0的特殊情况 */
    else {
        for (int i = 0; i < len; ++i)
            printf("%d", ans[i]);
    }

    /* 输出余数 */
    printf(" %d\n", r);

    return 0;
}
相关推荐
yi0112 分钟前
DAY27: LeetCode 110. 平衡二叉树 | 在递归中判断是否平衡
人工智能·笔记·python·算法·leetcode·二叉树·递归
96245617 分钟前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
m0_5474866621 分钟前
《数据结构:基于C语言的描述》全套PPT课件2026
c语言·数据结构
启友玩AI27 分钟前
微安级唤醒、毫安级识别:基于 CI3422 的 AI 眼镜语音交互开发实战
c语言·人工智能·科技·嵌入式硬件·ai·ar·语音识别
wuminyu36 分钟前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++
xuxigifxfh41 分钟前
牛客:HJ21 简单密码
java·开发语言·算法
小π军42 分钟前
C 和 C++ 是否都支持函数的重载?
java·c语言·c++
qq_4086068643 分钟前
确界的倒数性质证明
学习·算法
小蒋观天下1 小时前
【安防AI工程实战二】AI摄像头帧率抖动根治:ISP曝光时序与AI推理时序冲突深度定位
人工智能·深度学习·算法·安全·机器学习·ai大模型
云和数据.ChenGuang1 小时前
trace 是RAG检索链路的**全链路追踪日志对象
人工智能·深度学习·算法·排序算法