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

(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.lryc.cn/news/255332.html

相关文章:

  • 【AI】Windows环境安装GroundingDINO
  • 【Node.js】基础梳理 6 - MongoDB
  • .NET8 依赖注入
  • Ubuntu18安装(重启黑屏问题)
  • [PyTorch][chapter 4][李宏毅深度学习][Gradient Descent]
  • 利用proteus实现串口助手和arduino Mega 2560的串口通信
  • Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版
  • 题目:分糖果(蓝桥OJ 2928)
  • Leetcode刷题笔记——摩尔投票法
  • RabbitMq整合Springboot超全实战案例+图文演示+源码自取
  • 10-Hadoop组件开发技术
  • postman参数为D:\\audio\\test.mp3请求报错
  • 进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file
  • 611.有效的三角形个数
  • 超详细,使用JavaScript获取短信验证码
  • 利用 Python 进行数据分析实验(七)
  • 前端小技巧: 写一个异步程序示例, 使用任务队列替代promise和async/await等语法糖
  • 【Windows下】Eclipse 尝试 Mapreduce 编程
  • Python---time库
  • unity 自由框选截图(两种方法,亲测有效)
  • 项目代码规范
  • STM32的BKP与RTC简介
  • 11.Java安卓程序设计-基于SSM框架的Android平台健康管理系统的设计与实现
  • jetbrains卡顿(Pycharm等全家桶)终极解决方案,肯定解决!非常肯定!
  • c++的排序算法
  • YOLOv5独家原创改进:SPPF自研创新 | SPPF与感知大内核卷积UniRepLK结合,大kernel+非膨胀卷积提升感受野
  • 【C/PTA —— 15.结构体2(课外实践)】
  • 艾泊宇产品战略:适应新消费时代,产品战略指南以应对市场挑战和提升盈利
  • 使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s
  • ORACLE数据库实验总集 实验六 SQL 语句应用