当前位置: 首页 > article >正文

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

前言
本期我们分享用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.kler.cn/news/162177.html

相关文章:

  • C/C++---------------LeetCode第278. 第一个错误的版本
  • MySQL-DATE_FORMAT()函数
  • 如何设置和使用静态HTTP服务器
  • 一天一个设计模式---原型模式
  • [MySQL] MySQL复合查询(多表查询、子查询)
  • Linux学习教程(第十四章 Linux系统服务管理)一
  • Docker构建自定义镜像
  • Determining Which Version of GDS is Installed
  • 银河麒麟安装lnmp,安装chrome。
  • [FPGA 学习记录] 快速开发的法宝——IP核
  • 【异常】SpringBoot3.2.0 Description: Failed to configure a DataSource: ‘url‘ att
  • 商品详情页评论和评论列表评论的排序html代码
  • Python---面向对象其他特性
  • 前端小技巧: 写一个异步程序示例, 使用任务队列替代promise和async/await等语法糖
  • Node CLI 之 Commander.js (1)
  • 性能测试工具:Jmeter介绍
  • 什么是网站?
  • Zabbix自定义飞书webhook告警媒介1
  • 设计模式基础——工厂模式剖析(2/2)
  • 使用 python ffmpeg 批量检查 音频文件 是否损坏或不完整
  • 备忘录模式 rust和java的实现
  • 机器学习实战:预测波士顿房价
  • Linus:我休假的时候也会带着电脑,否则会感觉很无聊
  • [论文阅读]Sparse Fuse Dense
  • 快速排序的新用法
  • CleanMyMac软件2024最新Mac系统清理工具实用性测评
  • FFmpeg数据结构AVFrame
  • SpringBoot项目访问resources下的静态资源
  • 企业计算机服务器中了360勒索病毒如何解密,勒索病毒解密数据恢复
  • 十五届蓝桥杯分享会(一)