AcWing算法学习第三节---高精度问题.

简介: AcWing算法学习第三节---高精度问题.

# 系列文章目录

[第一节快速排序](https://blog.csdn.net/congfen214/article/details/127973670)

[第二节二分法](https://blog.csdn.net/congfen214/article/details/128078143)


---

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0dead988b1f04c3bb7496eacff42e7a2.jpeg#pic_center)

**学习路上的风景,我陪你一起去看,编程路上的算法,我陪你一起去学,朋友们你们好,我是夏目浅石,蟹蟹你点开文章和我一同进步,加油!遇见更好的自己。**


@[TOC](文章目录)


---


# 前言


今天学了一些高精度问题的方法这里给大家分享一下,希望大家也可以学习并且掌握。


---


`提示:以下是本篇文章正文内容,下面案例可供参考`


# 一、高精度加法

**知识点如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/02f04340a01f49528e6173357e177b07.png)

这是我在AcWing打卡界面总结的一些我自己的想法和思路,希望大家可以看完,接下来就是题目的讲解和代码;


1.输入的scanf还是效率很高的.并且有时候gets函数没办法使用,所以scanf,是一个挺好用的办法

2.char类型的输入方便输入更高位数,然后再减去‘0’的ASCII码值就能转换成想要的了。

3.核心的高精度算法–>就是每一个位数相加再加进位,然后再去莫10就是这个位数的答案了,再把进位除去10就是下一位的进位,依次类推就行…

4.输出的时候就是按照人类的习惯输出就好,就是倒着输出.


**题目如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/b51a13431e1a453ea2c7e91ce85852f9.png)

>代码如下(示例):


```c

#include<stdio.h>

#include<string.h>

int main()

{

   char arr1[100010],arr2[100010];

   scanf("%s",arr1);

   scanf("%s",arr2);

   int a[100010],b[100010],c[100010],len1=strlen(arr1),len2=strlen(arr2),i,j,k=0,t=0;

   for(i=len1-1,j=0;i>=0;i--) a[j++]=arr1[i]-'0';

   for(i=len2-1,j=0;i>=0;i--) b[j++]=arr2[i]-'0';

   for(i=0;i<len1||i<len2;i++)

   {

       if(i<len1) t=t+a[i];

       if(i<len2) t=t+b[i];

       c[k++]=t%10;

       t=t/10;

   }

   if(t) c[k++]=1;

   for(i=k-1;i>=0;i--) printf("%d",c[i]);

   return 0;

}

```



# 二、高精度减法

**知识点如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0a151f32f9b24bb8937dc170feb2be39.png)


之前看过许多博客关于这些高精度的,但是都是模棱两可,不是太理解,今天学了一下y总的高精度,大抵是懂了,这就来分享给大家让大家学习了。

总结:

1.我想就是拆分模块来写这一个算法,第一就是main函数,这里处理输入和调用函数的功能(作用),过多细节就看代码就行

2.讲解一下最先出现的cmp函数和后面出现的sub函数

@1.cmp函数就是比较这一串数字的长度以及大小这个功能,你先看俩字符串是否相同长度,不相同则长的一定大。

当长度相同时就需要比较两者的最高位是否相同(或者谁大谁小),依次类推直到找到不同则 return 1 or 0,这个函数尽量做到的是 c=a-b;a>=b。

@2.sub函数就是做减法对吧,根据cmp函数就是a-b这样,所以根据人的习惯啊,当3-5的时候人往往会变成-(5-3)这样去计算,所以就分成两种情况即:a开始就大于b,和a一开始小于b两种情况,所以一种需要先打印’-‘然后打印数字,另一种则不需要打印’-‘对吧?

3.高精度减法的核心算法:

两个数的低位相减然后看是否为负数,如果为负数则需要借10,则进位为1.

两个数的低位相减然后看是否为非负数,如果为非负数则不需要借10,且进位为0.

然后就是扫除前导零输出就可以了.


**题目如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/d8109df3283c41bdb0876f134be973d8.png)


>代码如下(示例):


```c

#include<stdio.h>

#include<string.h>

//c=a-b;a>=b;

int cmp(char arr1[],char arr2[],int len1,int len2)

{

   if(len1!=len2)

   {

       if(len1>len2) return 1;

       else return 0;

   }


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

   {

       if(arr1[i]!=arr2[i])

       {

           if(arr1[i]>arr2[i]) return 1;

           else return 0;

       }

   }

}

void sub(int a[],int b[],int len1,int len2)

{

   int c[100010],t=0;

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

   {

       t=a[i]-t;

       if(i<len2)

       {

           t=t-b[i];

       }

       c[i]=(t+10)%10;

       if(t<0) t=1;

       else t=0;

   }

   while(c[len1-1]==0&&len1-1>0) len1--;

   for(int i=len1-1;i>=0;i--)

   {

       printf("%d",c[i]);

   }

}


int main()

{

   //输入

   char arr1[100010],arr2[100010];

   int a[100010],b[100010];

   scanf("%s",arr1);

   scanf("%s",arr2);

   int len1=strlen(arr1),len2=strlen(arr2);


   for(int i=len1-1,j=0;i>=0;i--) a[j++]=arr1[i]-'0';

   for(int i=len2-1,j=0;i>=0;i--) b[j++]=arr2[i]-'0';


   if(cmp(arr1,arr2,len1,len2))

   {

       sub(a,b,len1,len2);

   }

   else

   {

       printf("-");

       sub(b,a,len2,len1);

   }

   return 0;

}

```

# 三、高精度乘法

**知识点如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/db2887f6f3a543a4aace586f5769b6ae.png)


类似于加法,会加法这个乘法真的非常简单。

总结:

1.输入的处理;

2.拿b去和数组a的每一位去乘,然后就是莫10放到c数组里面,然后让进位/10就是下一个数的进位了


**题目如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/7a88494de09b4984b899da7c4c3c8a81.png)



代码如下(示例):


```c

#include<stdio.h>

#include<string.h>

const int N=100010;

void cheng(int a[],int b,int len)

{

   int c[N],i,t=0;

   for(i=0;i<len||t;i++)

   {

       if(i<len)

       t=a[i]*b+t;

       c[i]=t%10;

       t/=10;

   }

   while(c[i]==0&&i>0) i--;

   for(int j=i;j>=0;j--) printf("%d",c[j]);

}

int main()

{

   char arr[N];

   scanf("%s",arr);

   int b,a[N],len=strlen(arr),i,j;

   scanf("%d",&b);

   for(i=strlen(arr)-1,j=0;i>=0;i--) a[j++]=arr[i]-'0';

   cheng(a,b,len);

   return 0;

}

```


该处使用的url网络请求的数据。


---

# 四、高精度除法

**知识点如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/5f6ad02223f0421582ddd387e001bd17.png)


高精度除法我感觉理解了这个过程其实这个题就不难,下main我来讲解一下吧hhh~

总结:

1.这里其实我想讲一讲最最重要的核心算法部分

这里其实就是理解t是除法做完商的余数,然后余数乘10+下一位数字就是新的被除数,依次类推,直到退出循环为止,下面只需要处理前导零,就可以输出啦!


**题目如下:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/421963cd75334a269b93c05e046e5899.png)




代码如下(示例):

```c

#include<stdio.h>

#include<string.h>

void chu(int a[],int b,int len)

{

int c[100010],t=0;

for(int i=len-1;i>=0;i--)

{

 t=t*10+a[i];

 c[i]=t/b;

 t%=b;

}

while(c[len-1]==0&&len-1>0) len--;

for(int i=len-1;i>=0;i--) printf("%d",c[i]);

printf("\n"); printf("%d",t);

}

int main()

{

char arr[100010];

int b,a[100010],len;

scanf("%s",arr);

scanf("%d",&b);

len=strlen(arr);

for(int i=len-1,j=0;i>=0;i--) a[j++]=arr[i]-'0';

chu(a,b,len);

return 0;

}

```


# 总结

**自己的感想:**

这里为了大家方便大家复习我会给出我的acwing的地址想去看的话就去看看,当然也可以去acwng报名自己学然后再看我的博客这样会效果更好,不理解的咱们一起讨论学习,我觉得会很不错hhh~

知识点图片汇总

**思维导图**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a97bd4cfbe4f446eb2e77a4d7b8e9e47.png)

记住这里面我是没有把核心算法家里面的,因为这只是一个宏观的导图,最重要的还是把我在acwing上的知识总结好好理解消化一下,这样才能获得收获hhh~咱们下一期见吧!


## 下期预告


****前缀和与差分,欢迎来看哦hhh拜拜啦大家!****

相关文章
|
10天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
10天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
10天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
10天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
10天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
10天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
10天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
10天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】
|
10天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!