高精度加法,减法,乘法,除法(上)(C语言)

前言
加,减,乘,除这些运算我们自然信手捏来,就拿加法来说,我们要用c语言编程算a+b的和,只需让sum = a+b即可,可是这是局限的,我们都知道int的表示的最大值为2147483647(32位和64位机器)。但是如果我们要算的数超过了这个值该怎么办?这时会有人说:用long long不得了么?,但是你想想假如你面对的是几百位甚至几千位的整数时,用long long也无济于事,这时候就需要用到我们的高精度算法了。那么话不多说,让我们开始吧!
在这里插入图片描述

文章目录

  • 1,加法
  • 2,减法
  • 3,尾声

1,加法

首先让我们回忆回忆小学的时候我们时怎样进行加法用算的。
在这里插入图片描述
我们先把两个数弄成两行然后按位相加,如果某一位相加后大于9那么就往前进一位,下一位+1,这一位-10.
我们的高精度加法也是采用这个思路。
因为int 和long long不能够满足我们的高精度加法,那么我们只能另辟蹊径,我们知道数组可以很长,如果我们把需要相加的两个数字分别存进两个数组之中,数字的个位放在下标0,数字的十位放在下标1,…以此类推。到最后我们再把两个数组相同下标相加求和,如果大于9就往前进一位。相加完之后我们就能够得到我们的所需要求的和了。
但是怎么把数字的个位放在下标为0的地方呢?我们可以先创建一个char类型的数组,然后用%s进行读取,读取完之后将其内容翻转即可。(既然是字符数组那么就要留意‘1’不等于1,‘1’-‘0’=1)
读取完两个数字之后我们想把他们相加,可是他们的位数可能不一样,比如"10001"和"100",为了方便我们需要将短的字符串变长,在其前头补上’0’(即把"100"改成"00100")。
下面我用代码的方式给大家展示。

#include <stdio.h>
#include<string.h>
    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_sum(int len1, char* arr1, char* arr2)
    {
        int q = 0;
        for (int i = 0; i < len1; i++)
        {
            arr1[i] += arr2[i];// '1'+'1'-'0'='2'
            arr1[i] -= '0';
            if (arr1[i] > '9')//大于10往前进一位
            {
                arr1[i] -= 10;
                if (i != len1 - 1)
                    arr1[i + 1] += 1;
                else//如果i=len1-1那么arr1[i]中存放的是'\0'需要+'1'来进一位
                {
                    arr1[i + 1] += '1';
                    q++;//长度+1,这里如果写len1++会导致循环失败
                }
            }
        }
        for (int i = len1 - 1 + q; i >= 0; i--)//倒序打印
        {
            printf("%c", arr1[i]);
        }
    }
    int main()
    {
        char arra[100] = { 0 }, arrb[100] = { 0 };//分别储存a,b的值
        scanf("%s %s", arra, arrb);
        int lena = strlen(arra);//计算a和b的长度
        int lenb = strlen(arrb);
        my_reverse(arra, lena);//将a和b进行翻转方便进行加法运算
        my_reverse(arrb, lenb);
    if (lena > lenb)//如果a的长度大于b的长度,在b后面补'0'方便计算
    {
        for (int i = lenb - 1; i < lena - 1; i++)
        {
            arrb[i + 1] += '0';
            lenb++;
        }
    }
    else if (lena < lenb)//如果b的长度大于a的长度,在a后面补'0'方便计算
    {
    for (int i = lena - 1; i < lenb - 1; i++)
    {
        arra[i + 1] += '0';
        lena++;
    }
      }
        print_sum(lena, arra, arrb);//相加并打印
    return 0;
}

我们自己写完之后,可以去洛谷 p1061题(A+B Problem(高精))进行自测。看看是否能通过。

2,减法

学会了高精度加法,自然高精度减法也不在话下。还是这种方法。
在这里插入图片描述
大致思路与加法相同,创建两个数组储存a和b,然后将两者相减即可,每一位小于0的话,前一位-1,这一位+10。
但是我们会发现,我们算a-b的时候如果b大于a会出现负数的情况,这会让我们不方便计算,那我们想一想,a-b是不是等于-(b-a)呢?如果b>a我们可以直接算b-a然后在结果的前面加上一个‘-’即可。
判定方法:如果字符串a的长度大于b的长度,那么不用多说a>b,反之b>a,但是当a=b的时候呢?我们回忆回忆我们之前是不是学过strcmp函数(链接:字符函数,字符串函数),通过这个函数我们可以按位比较ASCII值,通过这种函数我们就可以轻松判定当a和b长度相等时那个大那个小了(一定要在翻转前判定)。
下面我将用代码给大家展示。

#include <stdio.h>
#include<string.h>
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_sub(int len, char* arr1, char* arr2)
{
    for (int i = 0; i < len; i++)
    {
        if(arr2[i]!='\0')//如果该位置arr2[i]为\0则不需要减去'0'
        arr2[i] -= '0';
        arr1[i] -= arr2[i];
        if (arr1[i] < '0')
        {
            arr1[i + 1] -= 1;
            arr1[i] += 10;
        }
    }
    while (arr1[len - 1] == '0')//10001-10000的话会输出00001为了输出1我们要改变len的大小
        len--;
    for(int i = len-1;i>=0;i--)
    printf("%c", arr1[i]);
    if (len < 1)printf("0");//如果答案为0的时候len为0所以这是需要我们手动输入0
}
    int main()
    {
        char arra[10100] = { 0 }, arrb[10100] = { 0 };//分别储存a,b的值
        scanf("%s %s", arra, arrb);
        int lena = strlen(arra);//计算a和b的长度
        int lenb = strlen(arrb);
         if(lena == lenb)//我们的目的是让大的减去小的,所以要分情况讨论
        {
             if (strcmp(arra, arrb) >= 0)
             {
                 my_reverse(arra, lena);//将a和b进行翻转方便进行减法运算
                 my_reverse(arrb, lenb);
                 print_sub(lena, arra, arrb);
                 return 0;
             }
        else// 如果b>a, a-b=-(b-a)
        {
            printf("-");//打印个负号
            my_reverse(arra, lena);
            my_reverse(arrb, lenb);
            print_sub(lenb, arrb, arra);
            return 0;
        }    
        }
         my_reverse(arra, lena);
         my_reverse(arrb, lenb);
        if (lena > lenb)
        {
            print_sub(lena, arra, arrb);
        }
        else if (lena < lenb)// 如果b>a, a-b=-(b-a)
        {
            printf("-");//打印个负号
            print_sub(lenb, arrb, arra);
        }
        return 0;
    }

我们写完代码后可以去洛谷 p2142题(高精度减法)进行检测,看自己是否出现错误。

3,尾声

关于高精度乘法和高精度除法我们放到下一篇博客,如果觉得博主讲的不错,请一定要记得给博主点个关注,点个赞,最好再点个收藏(嘻嘻~)。那么我们下期再见吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java单人聊天

服务端 package 单人聊天;import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import…

23款奔驰E350eL升级小柏林音响 13个扬声器 590w

小柏林之声音响是13个喇叭1个功放&#xff0c;功率是590W&#xff0c;对应普通音响来说&#xff0c;已经是上等了。像著名的哈曼卡顿音响&#xff0c;还是丹拿音响&#xff0c;或者是BOSE音响&#xff0c;论地位&#xff0c;论音质柏林之声也是名列前茅。 升级小柏林音响&#…

LC-1466. 重新规划路线(DFS、BFS)

1466. 重新规划路线 中等 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c…

相交链表(LeetCode 160)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;暴力法方法二&#xff1a;哈希表方法三&#xff1a;双栈方法四&#xff1a;双指针&#xff1a;记录链表长度方法五&#xff1a;双指针&#xff1a;互换遍历 5.实现示例参考文献 1.问题描述 给两个单链表的…

短视频账号剪辑矩阵+无人直播系统源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&am…

Java 对接智谱 AI(官方 sdk 是真垃圾)

官方 sdk 狗屎。 一堆密钥不知道啥玩意&#xff0c;文档也没写好。 python 版本的就不清楚&#xff0c;应该支持会比较好&#xff0c;果然做 ai 应用后端开发还是得使用 python 比较好。 那么要如何对接智谱 AI 呢&#xff1f;用小博哥的这个版本&#xff0c;虽然不是官方的…

光伏基础知识

快速了解国内光伏历史 美国是最早制定光伏发电的发展规划的国家&#xff0c;国内从1958年开始专注于太阳电池的研究&#xff0c;到1971年3月首次将太阳电池成功地应用于我国第2颗卫星上&#xff0c;再到1979年开始生产单晶硅太阳电池&#xff0c;直到20世纪90年代中期后光伏发…

ElasticSearch篇---第六篇

系列文章目录 文章目录 系列文章目录前言一、ElasticSearch中的副本是什么?二、ElasticSearch中的分析器是什么?三、什么是ElasticSearch中的编译器?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…

技术培训邀请函|云时代数据安全建设和实践

在数字化变革时代&#xff0c;云计算渗透到各个行业和领域中&#xff0c;赋能业务创新发展&#xff0c;但机遇与挑战并存。数据作为战略性资产和核心生产要素&#xff0c;在混合多云环境面临着日益严峻的安全风险和越来越多的合规要求。如何实现有效的数据安全保护&#xff0c;…

C++新经典模板与泛型编程:萃取技术中的值萃取

传入一种类型&#xff0c;萃取出另外一种类型 #include <iostream>template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int; };template<> struct SumFixedTraits<int> {using sumT __int…

【华为网络-配置-025】- 同 VLAN 下不同网段通信(启用 Sub 地址)

要求&#xff1a; 1、各接口配置 VLAN 后配置 Sub 地址使 PC1 与 PC3 通信。 一、sub 地址配置 [LSW1]vlan 10 [LSW1]port-group group-member GigabitEthernet 0/0/1 to GigabitEthernet 0/0/2 [LSW1-port-group]port link-type access [LSW1-port-group]port default vla…

2023年【起重机械指挥】考试题库及起重机械指挥考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试题库根据新起重机械指挥考试大纲要求&#xff0c;安全生产模拟考试一点通将起重机械指挥模拟考试试题进行汇编&#xff0c;组成一套起重机械指挥全真模拟考试试题&#xff0c;学员可通过起重机械指挥…

Node.js版本管理工具NVM(Node Version Manager)的使用

nvm简介 nvm&#xff08;Node Version Manager&#xff09;是一个用于管理 Node.js 版本的工具。它可以让你在同一台计算机上安装并切换多个 Node.js 版本&#xff0c;非常方便。 如何安装 nvm 下载 nvm 安装包 访问 nvm下载地址 &#xff0c;根据你的操作系统选择对应的安…

“触底”来临?!看看专家怎么说!鼎捷2023年H2半导体行业观察报告火热出炉!

半导体行业周期性“触底”&#xff0c;喊了半年多。如今“底”在哪&#xff1f; 面对业内争议颇多的“V”字拐点是否到来&#xff0c;可以盖棺定论&#xff1f; 不确定的因素依然存在。 但多种迹象表明&#xff0c;半导体行业的回暖趋势已逐渐明朗&#xff01; 用数据说话&…

小型洗衣机什么牌子好又便宜?目前口碑最好的迷你洗衣机

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

MBA-历年数学条件充分判断

已知p&#xff0c;q 为非零实数. 则能确定的值. (1)pq1 &#xff08;2&#xff09; 1. pq1 ; p 1-q ; ;无法确定 1&#xff1b;q ; * * 1;可以确定 信封中装有10张奖券&#xff0c;只有1张有奖.从信封中同时抽取2张奖券&#xff0c;中奖的概率记为 P;从信…

【NLP】如何管理大型语言模型 (LLM)

什么是LLM编排&#xff1f; LLM 编排是管理和控制大型语言模型 (LLM)的过程&#xff0c;以优化其性能和有效性。这包括以下任务&#xff1a; 提示LLM&#xff1a;生成有效的提示&#xff0c;为LLMs提供适当的背景和信息以产生所需的输出。链接LLM&#xff1a; 结合多个LLM的输…

决战排序之巅(一)

决战排序之巅 插入排序直接插入排序 void InsertSort(int* arr, int n)希尔排序 void ShellSort(int* arr, int n)测试插入排序测试函数 void verify(int* arr, int n)测试 InsertSort测试 ShellSort测试速度 InsertSort & ShellSort 选择排序直接选择排序 void SelectSort…

生命在于折腾——使用PD打开OVA格式虚拟机

一、前言 下载了一个封装的工具箱虚拟机&#xff0c;格式是OVA的&#xff0c;PD无法直接打开&#xff0c;之前成功转换后打开过&#xff0c;但那时候没有记录&#xff0c;今天记录一下。 二、过程 有两种方法 1、去vmware官网下载工具VMware OVF Tool 地址&#xff1a;htt…

Spatial Data Analysis(四):空间自相关示例

Spatial Data Analysis&#xff08;四&#xff09;&#xff1a;空间自相关示例 空间自相关是地理信息科学&#xff08;GIS&#xff09;和空间统计学中的重要概念之一&#xff0c;用于研究地理空间上的数据变异性和相关性。空间自相关分析的目标是探讨地理空间中的现象是否呈现…