C语言实现高精度加减法

C语言实现高精度加减法

简介

高精度计算是指多位数的加、减、乘、除等算法。在计算机程序设计中,常常需要进行高精度计算。C语言是一种强大的编程语言,可以通过C语言实现高精度的加、减法运算。

实现思路

1. 字符串存储

高精度计算需要用到大量的数字,超过了C语言中能够表示的整型、浮点型数据类型范围,因此可以采用字符串存储数字。

2. 进位处理

在高精度计算中,进位是必须要处理的问题。如果相加或相减的两个数相加/减的结果大于等于10,就需要将进位加到下一位的运算中。

3. 数组存储

为了方便计算,高精度数字通常都是使用数组的形式存储,每个元素存储一位数字。

4. 补位操作

进行高精度计算时,两个数字的长度可能会不相同,为了方便计算,需要对长度较短的数字进行补位操作,即在数字的最前面增加0。

实现代码

高精度加法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max_n 5050

void add(char str1[], char str2[], char ans[])
{
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int len = len1 > len2 ? len1 : len2;
    int a[max_n] = {0}, b[max_n] = {0}, c[max_n] = {0};
    for (int i = 0; i < len1; i++) a[i] = str1[len1 - i - 1] - '0';
    for (int i = 0; i < len2; i++) b[i] = str2[len2 - i - 1] - '0';
    for (int i = 0; i < len; i++)
    {
        c[i] = a[i] + b[i] + c[i];
        if (c[i] >= 10) c[i + 1]++, c[i] -= 10;
    }
    while (len > 0 && !c[len - 1]) len--;
    if (len == 0) ans[0] = '0', ans[1] = '\0';
    else
    {
        for (int i = 0; i < len; i++) ans[i] = c[len - i - 1] + '0';
        ans[len] = '\0';
    }
}

int main()
{
    char str1[max_n], str2[max_n], ans[max_n];
    scanf("%s%s", str1, str2);
    add(str1, str2, ans);
    printf("%s\n", ans);
    return 0;
}

高精度减法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max_n 5050

int cmp(char str1[], char str2[])
{
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    if (len1 > len2) return 1;
    if (len1 < len2) return -1;
    for (int i = len1 - 1; i >= 0; i--)
        if (str1[i] > str2[i]) return 1;
        else if (str1[i] < str2[i]) return -1;
    return 0;
}

void sub(char str1[], char str2[], char ans[])
{
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int len = len1 > len2 ? len1 : len2;
    int a[max_n] = {0}, b[max_n] = {0}, c[max_n] = {0};
    int flag = cmp(str1, str2);
    if (flag == 0) { ans[0] = '0'; ans[1] = '\0'; return; }
    if (flag == -1) { strcpy(ans, "-"); char tmp[max_n]; strcpy(tmp, str1); strcpy(str1, str2); strcpy(str2, tmp); }
    for (int i = 0; i < len1; i++) a[i] = str1[len1 - i - 1] - '0';
    for (int i = 0; i < len2; i++) b[i] = str2[len2 - i - 1] - '0';
    for (int i = 0; i < len; i++)
    {
        if (a[i] < b[i]) a[i] += 10, a[i + 1]--;
        c[i] = a[i] - b[i];
    }
    while (len > 0 && !c[len - 1]) len--;
    for (int i = 0; i < len; i++) ans[i] = c[len - i - 1] + '0';
    ans[len] = '\0';
}

int main()
{
    char str1[max_n], str2[max_n], ans[max_n];
    scanf("%s%s", str1, str2);
    sub(str1, str2, ans);
    printf("%s\n", ans);
    return 0;
}

示例说明

示例1

输入:

123456789
987654321

输出:

1111111110

示例2

输入:

123456789
234567890

输出:

-111111101

以上代码仅为高精度加减法的简单实现,实际的高精度计算中,还需要考虑诸多问题,例如高精度乘法、高精度除法等,读者可根据实际需要进行扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现高精度加减法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言与Lua之间的相互调用详解

    关于“C语言与Lua之间的相互调用详解”的完整攻略,我建议从以下几个方面进行详细讲解: 引言 介绍C语言与Lua的相关背景信息,对二者的区别和联系进行简要说明,概括C语言与Lua之间的相互调用的基本流程和原理。 C语言与Lua之间的调用 首先讲解C语言调用Lua函数的流程,主要包括: 编写Lua脚本文件; C语言调用Lua脚本文件中的函数; C语言向Lua传…

    C 2023年5月23日
    00
  • mysql5.7.21安装配置教程

    MySQL 5.7.21安装配置教程 MySQL是一款功能强大的关系型数据库管理系统,广泛用于Web开发、企业应用等领域。本教程将介绍如何在Windows操作系统上安装配置MySQL 5.7.21版本。 安装MySQL 打开MySQL官网下载页面下载MySQL Community Server 5.7.21版本的安装程序。 运行安装程序,选择Custom选项…

    C 2023年5月22日
    00
  • 解决JSON.parse转化不规范json字符串的问题

    当JSON.parse遇到不规范的JSON字符串时,它将会抛出JSON.parse错误,导致代码无法继续执行。这时可以采用一些技巧和工具来解决这个问题。 1.使用try-catch语句 在JSON.parse方法周围包裹try-catch语句是解决这个问题的一种常见方式。这样如果JSON.parse方法抛出异常,我们就可以在catch语句中捕获这个异常,然后…

    C 2023年5月23日
    00
  • c++中比较好用的“黑科技”

    当提到“黑科技”时,通常指的是一些比较高级的、难以理解或者鲜为人知的技巧和方法。C++ 作为一门非常强大和复杂的编程语言,有很多这样的“黑科技”可以挖掘。下面我会详细讲解一些在 C++ 中比较好用的“黑科技”。 一、代码优化 1.1 利用符号位进行快速计算 由于在计算机中,数值的正负关系是以符号位的形式存储的。因此在某些情况下,我们可以利用符号位来进行快速计…

    C 2023年5月23日
    00
  • 一篇文章带你了解C++多态的实现原理

    一篇文章带你了解C++多态的实现原理 概述 多态是面向对象编程中的一个重要概念,它使不同类型的对象对同一消息作出响应。C++支持多态,实现方式包括虚函数和函数指针等。本文主要讲解C++多态的实现原理和使用方法。 代码示例 我们通过一个简单的代码示例来演示多态的实现。 案例描述 假设有一个基类Animal,有两个派生类Dog和Cat,它们都实现了一个虚函数ma…

    C 2023年5月22日
    00
  • MySQL数据库操作DQL正则表达式

    MySQL数据库操作DQL正则表达式可以帮助我们更高效地检索数据库中的数据,本文将详细讲解如何使用正则表达式进行MySQL数据库的数据检索。 什么是正则表达式 正则表达式是一种文本模式,用于匹配字符串中的一部分或整个字符串。它是在很多编程语言中都可用的工具,用于匹配、查找和替换文本。 在MySQL中,可以使用正则表达式进行模糊查询和根据一定的规则来查询数据。…

    C 2023年5月22日
    00
  • C++实现LeetCode(123.买股票的最佳时间之三)

    下面我将从几个方面来详细讲解“C++实现LeetCode(123.买股票的最佳时间之三)”的完整攻略。 一、题目描述 本题的题目描述如下: 给定一个数组 prices ,其中 prices[i] 代表某股票在第 i 天的价格。你最多可以完成两笔交易。计算你所能获取的最大利润。注意:你不能同时参与多笔交易(即,你必须在再次购买之前卖出之前的股票)。 但是,在完…

    C 2023年5月22日
    00
  • C++11中bind绑定器和function函数对象介绍

    C++11中bind绑定器和function函数对象介绍 C++11引入了许多新特性,其中包括bind绑定器和function函数对象。这些特性使得C++在编写现代化的代码方面变得更加简单和灵活,为程序员提供了更多的工具来实现代码复用和组合。 bind绑定器 bind绑定器是一个函数模板,它可以用来将一个函数的参数绑定到特定的值或另一个函数。这使得我们可以轻…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部