2023-10-26 用C语言实现一个大整数加法

news2024/11/20 16:36:23

点击 <C 语言编程核心突破> 快速C语言入门


用C语言实现一个大整数加法

  • 前言
  • 一、思路和代码设计
    • 数字对齐:
    • 字符对齐:
  • 二、代码
  • 总结


前言

要解决问题: 实现大整数加法

想到的思路: 用字符代替数字, 逐个计算, 过10进位.

其它的补充: 同样思路可以解决减法, 乘法, 但除法没有想到如何解决.


一、思路和代码设计

C语言的整型都是有位数限制的, 用字符代替整型进行计算, 然后输出可能是比较直接的解决思路.

加法有两个问题要解决, 对齐以及进位.

加法算式是右对齐, 字符串则是左对齐, 比较可行的方案是字符串计算前倒置, 算出结果后再倒置回来.

数字对齐:

数字对齐

字符对齐:

字符对齐

进位则要将相应位置的结果除以十, 余数留下, 商作为一个修正, 和向后移动一位字符的位置的数字计算结果相加.

二、代码

#include <stdio.h>
#include <string.h>

#define MAX_LEN 1024

char lhs[MAX_LEN];
char rhs[MAX_LEN];
char result[MAX_LEN];

int reverse(char *str);
void add(char *lhs, char *rhs, char *result);

int main()
{
    scanf("%s %s", lhs, rhs);
    add(lhs, rhs, result);
    printf("%s\n", result);
    return 0;
}

int reverse(char *str)
{
    const int len = (int)strlen(str);
    char temp;

    for (int i = 0; i != len / 2; i++)
    {
        temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }

    return len;
}

void add(char *lhs, char *rhs, char *result)
{
    int lhsLen = reverse(lhs);
    int rhsLen = reverse(rhs);

    int carry = 0;
    const int ten = 10;

    for (int i = 0, j = 0, sum; i < lhsLen || j < rhsLen; i++, j++)
    {
        sum = (i < lhsLen ? lhs[i] - '0' : 0) +
              (j < rhsLen ? rhs[j] - '0' : 0) + carry;

        result[i] = (char)(sum % ten + '0');

        carry = sum / ten;
    }

    int maxLen = lhsLen > rhsLen ? lhsLen : rhsLen;

    if (carry > 0)
    {
        result[maxLen++] = (char)(carry + '0');
    }

    result[maxLen] = '\0';

    reverse(result);
}

总结

用C语言实现大整数加法, 就是将数学的基本运算翻译为程序, 可能实现的效率不一定很高, 相比较整型原生的计算, 但作为一个学习材料还是可以的.


点击 <C 语言编程核心突破> 快速C语言入门


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu安装idea

idea下载 选择第一个.tar.gz(Linux)下载 解压后 进入bin目录在终端运行./idea.sh即可

数据安全法开始正式实施的时间是什么时候?主要目的是什么?

大数据时代&#xff0c;数据生成贯穿于经济活动的方方面面&#xff0c;贯穿于企业&#xff0c;贯穿于民生。数据是国家基础性战略资源&#xff0c;没有数据安全就没有国家安全。所以保障数据安全至关重要。那你知道数据安全法开始正式实施的时间是什么时候&#xff1f;主要目的…

眨个眼就学会了PixiJS

本文简介 带尬猴&#xff0c;我是德育处主任 当今的Web开发中&#xff0c;图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎&#xff0c;已经成为了许多开发者的首选&#xff08;我吹的&#xff09;。本文将为工友们介绍PixiJS的…

完美解决configure: error: APR not found. Please read the documentation.

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; ./configure 出现如下问题&#xff1a; configure: error: APR not found. Please read the documentation. 二、原因&#xff1a; 配置&#xff1a;错误&#xff1a;找不…

火山引擎DataLeap背后的支持者 - 工作流编排调度系统FlowX

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 背景介绍 业务场景 在日常工作中&#xff0c;我们时不时需要对某些逻辑进行重复调度&#xff0c;这时我们就需要一个调度系统。根据不同的调度需求&#xff0c;可…

【Qt之QtConcurrent】描述及使用

描述 QtConcurrent是一个Qt库中的模块&#xff0c;用于实现多线程并发编程。它提供了一些高级API&#xff0c;使得在多核处理器上并行执行代码变得更加容易。 示例&#xff1a; 使用的话&#xff0c; 需要在pro文件中添加&#xff1a;QT concurrent模块。 #include <QC…

微信公众号分销商城源码系统+多元商家+收银台 带完整的搭建教程

给大家推荐一款微信公众号分销商城源码系统&#xff0c;这是一个全新三级分销商城&#xff0c;功能十分丰富。一起来看看你吧。 微信公众号分销商城的功能&#xff1a; 1.商品展示和推广&#xff1a;商家可以在商城中展示商品信息&#xff0c;包括商品名称、价格、库存等&#…

基于java的ssm框架农夫果园管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

使用 jdbc 技术升级水果库存系统(优化版本)

抽取执行更新方法抽取查询方法 —— ResultSetMetaData ResultSetMetaData rsmd rs.getMetaData();//元数据,结果集的结构数据 抽取查询方法 —— 解析结果集封装成实体对象提取 获取连接 和 释放资源 的方法将数据库配置信息转移到配置文件 <dependencies><depend…

【Java 进阶篇】Java HTTP 概述

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于传输超文本的应用层协议。它是构建互联网的基础之一&#xff0c;用于在客户端和服务器之间传递数据和请求资源。本文将为初学者提供关于 Java 中 HTTP 的概述&#xff0c;从 HTTP 请求和响应的基础知识到 Ja…

专业成就信赖-南大通用在分布式数据库的创新实践

在第二十五届中国国际软件博览会中国数据库产业峰会上&#xff0c;GBASE南大通用8c产品部总经理分享了题为“分布式数据库的创新实践”的演讲&#xff0c;全面解析了分布式数据库的发展和演进&#xff0c;以及GBASE南大通用分布式数据库的发展历程&#xff0c;详细介绍了第三代…

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…

作为一名程序员面临哪些挑战?应该如何应对?

在现今互联网失业潮的大环境下&#xff0c;每一位程序员都面临着被淘汰的风险&#xff0c;但逃避没有用&#xff0c;今天我们就来总结这些挑战与风险&#xff0c;找准自己的方向与定位&#xff0c;做好职业规划&#xff0c;希望这些信息能对大家有所帮助。 一、面临的挑战 老…

菱形(曼哈顿距离) C++实现

题目 代码 #include<iostream> using namespace std;int main(){int n;scanf("%d",&n);int cxn/2,cyn/2;for(int i0;i<n;i){for(int j0;j<n;j){if(abs(i-cx) abs(j-cy) < n/2) printf("*");else printf(" ");}puts("&…

Redis | 数据结构(01)

这里写自定义目录标题 Redis 速度快的原因除了它是内存数据库&#xff0c;使得所有的操作都在内存上进行之外&#xff0c;还有一个重要因素&#xff0c;它实现的数据结构&#xff0c;使得我们对数据进行增删查改操作时&#xff0c;Redis 能高效的处理。 因此&#xff0c;这次我…

【Ubuntu系统如何添加多个python版本并且切换】

ubuntu切换默认的python版本 当你安装 Debian Linux 时&#xff0c;安装过程有可能同时为你提供多个可用的 Python 版本&#xff0c;因此系统中会存在多个 Python 的可执行二进制文件。一般Ubuntu默认的Python版本都为2.x, 如何改变Python的默认版本。 你可以按照以下方法使用…

纯C语言实现解析单色位图文件获取颜色值

在绘制单色位图时&#xff0c;需要考虑字节对齐问题。字节对齐是指数据存储在内存中时按照多字节对齐的原则进行存放&#xff0c;以提高访问效率。 为了实现这个函数&#xff0c;可以按照以下步骤进行&#xff1a; 计算每行像素数据的实际占用字节数&#xff1a;每个像素占用1…

Shellcode——绕过31

遇到了一道ctf题目&#xff0c;要求shellcode的每一个字节都必须大于31。 如果没有这个限制的话&#xff1a; 这是最方便的了。 但是必须大于31. 所以我想&#xff0c;那就吧所有小于31的加上31&#xff0c;然后运行的时候这部分代码自己修改自己。 也就是SMC,&#xff0…

(二开)Flink 修改源码拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1&#xff09;定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a&#xff09;类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法&#xff1a; Override pu…

redis缓存击穿 穿透

我们之前写了一把分布式锁 并且用redis写的, redis内部实现是比较完善的&#xff0c;但是我们公司用的时候 redis 至少都是主从&#xff0c;哨兵,cluster 很少有单机的 呢么我们分布式锁基于集群问题下会有什么问题 比如说当第一个线程设置一个key过来进行加锁&#xff0c;加锁…