(C语言实现)高精度除法 (洛谷 P2005 A/B Problem II)

news2024/11/19 3:19:30

前言
本期我们分享用C语言实现高精度除法,可通过该题测试点我点我,洛谷 p2005。
那么话不多说我们开始吧。
在这里插入图片描述
讲解
大家还记不记得小学的时候我们是怎么做除法的?我们以111÷5为例。
在这里插入图片描述

我们的高精度除法也将采用这个思路进行,分别用两个数组储存数字a和b的值,翻转后,从相对最高位开始相除,虽然我们不好实现除法,但是我们可以实现减法,比如11÷5可以理解为11-5-5这样商就是2余数就是1,也就是所我们可以弄一个减法的循环直到不能再减就退出循环。那么我们在相减之前就需要判断两者的大小,比如1和5明显没法再减了,我们就需要跳到下一位再重新进行减法循环。
大致的思路就是这样,下面我们用代码讲解:

#include <stdio.h>
#include<string.h>
char arra[20000] = { 0 }, arrb[20000] = { 0 };//分别储存a,b的值
int ans[20000] = { 0 };//储存商
int judge(char* arr1, char* arr2, int len)//判断是否可以相减的函数
{
    if (arr1[len] >'0') return 1; //如果arr1比arr2长, 则可以除 
    for (int i = len - 1; i >= 0; i--) {//从arr的最高位开始与arr2比较 
        if (arr1[i] > arr2[i]) return 1;//相同位时arr1中的数字更大,则可以相除
        else if (arr1[i] < arr2[i]) return 0;//相同位时arr1数字更小则不能相除
    }
    return 1;//arr1和arr2完全一样,可以相除 
}
void my_reverse(char* arr, int len)//翻转函数
{
    for (int i = 0; i < len - 1; i++, len--)
    {
        char temp = arr[i];
        arr[i] = arr[len - 1];
        arr[len - 1] = temp;
    }
}
void print_div(int len1, int len2, char* arr1, char* arr2, int* ans)
{
    for(int i = len1-len2;i>=0;i--)//从最高位开始
    {
        while (judge(arr1 + i, arr2, len2))//判定是否可以相减
        {
            for (int j = 0; j < len2; j++)//高精度减法
            {
                if (arr1[i + j] < arr2[j])
                {
                    arr1[i + j + 1] -= 1;
                    arr1[i + j] += 10;
                }
                arr1[i + j] -= (arr2[j] - '0');
            }
            ans[i]++;//ans[i]不可能>10
        }
    }
    int len_ans = len1 - len2;//ans的长度
    while (arr1[len1] == '0' && len1 > 0) len1--;//去掉前缀无用的零 
    while (ans[len_ans] == 0 && len_ans > 0) len_ans--;
    for (int i = len_ans; i >= 0; i--)//打印商
    {
        printf("%d", ans[i]);
    }
    printf("\n");
    //如果想要得到余数,则直接打印arr1即可,此时arr1存储的正是余数需要余数直接把下面的注释消掉即可
    //if (len1 > 0||arr1[0]>='0')
    //  for (int i = len1 - 1; i >= 0; i--)
    //      printf("%c", arr1[i]);
}
int main()
{

    scanf("%s %s", arra, arrb);
    int lena = strlen(arra);//计算a和b的长度
    int lenb = strlen(arrb);
    my_reverse(arra, lena);
    my_reverse(arrb, lenb);
    print_div(lena, lenb, arra, arrb, ans);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1294683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一&#xff1a;运用for循环进行拷贝方法二&#xff1a;Java内置方法进行拷贝方法三&#xff1a;指定区间进行拷贝 概述 数组拷贝。 注意&#xff1a; public static void main(String[] args) {int[] array1 {1,2,3,4};System.out.println(myToString(array…

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时&#xff0c;使用 Python 程序访问支持 HTTP/2 协议的网站时&#xff0c;有时会遇到超时问题。这可能会导致数据获取不完整&#xff0c;影响爬虫程序的正常运行。 问题描述 在实际操作中&#xff0c;当使用 Python 编写的爬虫程序访问支持 HTT…

第一课【习题】给应用添加通知和提醒

构造进度条模板通知&#xff0c;name字段当前需要固定配置为downloadTemplate。 给通知设置分发时间&#xff0c;需要设置showDeliveryTime为false。 OpenHarmony提供后台代理提醒功能&#xff0c;在应用退居后台或退出后&#xff0c;计时和提醒通知功能被系统后台代理接管…

【开源】基于Vue+SpringBoot的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

在 KubeCon CN 2023 的「 Open AI 数据 | Open AI Data」专题中&#xff0c;火山引擎软件工程师胡元哲分享了《使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载&#xff5c;Sailing Ray workloads with KubeRay and Kueue in Kubernetes议题。以下是本次演讲的文字…

区块链实验室(28) - 拜占庭节点劫持区块链仿真

在以前的FISCO环境中仿真拜占庭节点攻击区块链网络。该环境共有100个节点&#xff0c;采用PBFT作为共识机制&#xff0c;节点编号分别为&#xff1a;Node0&#xff0c;Node&#xff0c;… &#xff0c;Node99。这100个节点的前2010区块完全相同&#xff0c;自区块2011开始分叉。…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能&#xff0c;之前也一直思考过这个功能该如何实现&#xff0c;对于mdk/qtav等内核组件&#xff0c;可以直接用该组件提供的接口实现即可&#xff0c;而对于ffmpeg&#xff0c;需要自己处理&#xff0c;如果有缓存的数据的话&#xff0c;可以…

一文了解半导体检测的利器—探针台

探针台是半导体行业重要的检测装备之一&#xff0c;其广泛应用于复杂、 高速器件的精密电气测量&#xff0c;旨在确保质量及可靠性&#xff0c;并缩减研发时间和器件制造工艺的成本。 半导体测试可以按生产流程可以分为三类&#xff1a;验证测试、晶圆测试测试、封装检测。探针…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢&#xff0c;每次都能带来一些最前沿的方向标&#xff0c;这次也不例外。在看完一些 keynote 和介绍之后&#xff0c;我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

首次发布亚马逊云科技生成式AI技术堆栈,re:Invent大会重磅发布

亚马逊云科技总是在不断重构&#xff0c;以推动创新&#xff0c;而今年re:Invent的主角毫无疑问是生成式AI。这从亚马逊云科技副总裁、首席布道师Jeff Barr在re:Invent 2023之前就迫不及待地写了一篇关于PartyRock的体验试玩教程即可窥见一斑。 事实也确实如此。在Las Vegas&am…

echarts绘制一个环形图2

其他echarts&#xff1a; echarts绘制一个环形图 echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 效果&#xff1a; 组件代码&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

node14升级node16之后无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 新版的依赖 "scripts": {"dev": "webpack-dev-se…

梳理一下嵌入式和单片机之间的关系

一定有很多人都听说过嵌入式和单片机&#xff0c;但在刚开始接触时&#xff0c;不知道大家有没有听说过嵌入式就是单片机这样的说法&#xff0c;其实嵌入式和单片机还是有区别的。单片机与嵌入式到底有什么关系&#xff1f; 下面我们就来说说嵌入式和单片机之间的联系和区别吧…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

在linux上如何运用虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO 创建VDO设备以节约硬盘空间 16.1 了解什么是VDO VDO全称是Virtual Data Optimize&#xff08;虚拟数据优化)&#xff0c;主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2&#xff0c;大小都是10G。file…

如何正确使用网管工业交换机

工业交换机是一种专为满足工业应用需求而设计的通讯设备。它具备工业级品质&#xff0c;如耐受高温和低温的能力&#xff0c;能够抵御振动、防雷和防尘。此外&#xff0c;工业交换机还集成了多种丰富的协议&#xff0c;包括路由、交换和安全功能。根据是否可进行“网络管理”的…

下跌中寻求上涨,昂首资本根据交易量预判牛市

各位投资者你是不是也害怕熊市&#xff0c;担心在熊市中被套&#xff0c;但是投资者你知道吗&#xff1f;专业的投资者难道在熊市中就不会交易吗&#xff1f;昂首资本肯定的告诉你&#xff0c;肯定是交易的&#xff0c;并且常常还是以盈利结束交易。其实我们投资者和专业高手的…

跨境企业必看,数据跨境传输相关要求详解

对于跨境企业而言&#xff0c;数据的跨境传输既是业务拓展、竞争力提升、运营效率优化的重要手段&#xff0c;也是全球化发展和国际合作的必要条件。然而&#xff0c;这一过程伴随着法律差异、技术难题等多重挑战&#xff0c;企业需要谨慎应对&#xff0c;确保数据的安全、合规…

深入理解Dubbo-2.Dubbo功能之高级特性分析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…