首页 > 其他分享 >C语言两个较大数字相加

C语言两个较大数字相加

时间:2024-07-03 22:27:34浏览次数:31  
标签:数字 int 相加 C语言 char maxLen result str sum

C语言两个较大数字相加

思路分析

由于C语言中的基本数据类型(如int、long等)有固定的大小,无法直接处理非常大的数字(如数百位的数字)。因此,我们需要采用字符串或数组来表示大数字,并逐位进行加法操作。具体思路如下:

  1. 输入处理:将两个大数字以字符串的形式输入,并将其反转,以方便从低位到高位进行逐位相加。
  2. 逐位相加:从低位到高位逐位相加,同时处理进位问题。如果两个数字长度不同,则在短数字的高位补0。
  3. 处理进位:如果最高位有进位,则在结果的最高位补1。
  4. 结果处理:将结果字符串反转,得到最终的大数字和结果。

示例代码

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

// 反转字符串函数
void reverse(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

// 大数相加函数
char* addLargeNumbers(const char *num1, const char *num2) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int maxLen = len1 > len2 ? len1 : len2;

    // 分配结果字符串,长度最多为 maxLen + 1(可能会有进位)
    char *result = (char *)malloc(maxLen + 2);
    memset(result, 0, maxLen + 2);

    // 反转输入字符串
    char n1[maxLen + 1], n2[maxLen + 1];
    strcpy(n1, num1);
    strcpy(n2, num2);
    reverse(n1);
    reverse(n2);

    // 补齐较短的数字
    for (int i = len1; i < maxLen; i++) n1[i] = '0';
    for (int i = len2; i < maxLen; i++) n2[i] = '0';

    int carry = 0;
    for (int i = 0; i < maxLen; i++) {
        int digit1 = n1[i] - '0';
        int digit2 = n2[i] - '0';
        int sum = digit1 + digit2 + carry;
        result[i] = (sum % 10) + '0';
        carry = sum / 10;
    }
    if (carry) result[maxLen] = carry + '0';

    // 反转结果字符串
    reverse(result);

    return result;
}

int main() {
    char num1[1000], num2[1000];
    printf("输入第一个大数: ");
    scanf("%s", num1);
    printf("输入第二个大数: ");
    scanf("%s", num2);

    char *sum = addLargeNumbers(num1, num2);
    printf("两个大数的和: %s\n", sum);

    free(sum);
    return 0;
}

标签:数字,int,相加,C语言,char,maxLen,result,str,sum
From: https://blog.csdn.net/PeterClerk/article/details/140163762

相关文章

  • C语言笔记(第n版):数据类型与运算
            尽管对于计算机而言无所谓数据类型,因为所有的数据都在计算机中以二进制数进行存储,运输和计算,但是对数据进行人为的划定有益于人们对于数据的操作。        在C语言中对于数据类型的划分(因人而异)大致为:一、基本数据类型 什么是数据类型?   ......
  • 模拟集成电路设计系列博客——8.4.2 时间-数字转换器
    8.4.2时间-数字转换器在上一节我们介绍了TDC的一种典型实现,即单延时链TDC,通过\(2^N\)的延迟单元和D触发器可以实现Nbit的时间数字转换功能,但这种结构的分辨率受到延迟单元的最小延迟时间限制,即:\[LSB=\tau_{delay}=\frac{T}{2^N}\tag{8.4.10}\]其中\(T\)为TDC的最大量程,\(\ta......
  • C语言命名规范
    C语言命名规范在C语言中,命名规范对于代码的可读性和可维护性至关重要。以下是一些常见的C语言命名规律和建议变量命名变量名应该具有描述性,清晰地表达变量的用途或含义。变量名使用小写字母和下划线(snake_case)的组合,例如intmy_variable;。避免使用单个字符作为变量名,除非......
  • 学习笔记485—Excel技巧:一键将文本数字转换为数值
    Excel技巧:一键将文本数字转换为数值在使用Excel进行数据处理时,经常会遇到数据格式不匹配的问题。特别是当从外部导入数据或手动输入数据时,数字可能会被误识别为文本格式,这在进行数据计算和分析时会带来诸多不便。幸运的是,Excel提供了一些便捷的方法,可以帮助我们一键将文本转换为......
  • Luogu P6104 [EER2] 相同的数字
    令\(\text{nxt}_i\)为\(i\)之后的第一个质数。考虑最后\(a_i\)会变成什么。首先第一种就是直接变为\(\maxa_i\)。其次还发现可能变为\(\operatorname{nxt}_{\maxa_i}\)。对于其他的,可以证明一定不优于这两种,因为其他的情况无非就是在这基础上继续跳\(\operatorname......
  • c语言基础3
    [1]运算符1.1逻辑运算符&&逻辑与:全真则真,一假则假||逻辑或:一真则真,全假则假!逻辑非:非真则假,非假则真0为假1为真printf("%d\n",2>3);//0printf("%d\n",22>3);//1printf("%d\n",12>3&&8<6);//0printf("%d\n",12>3||8<......
  • 数字化供应链:背景&特点
    ​背景1、外部环境近年来,供应链脆弱性凸显,企业供应链压力难以缓解。美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示:61%的供应链经理预计,供应链紊乱问题至少会持续到2024年,29%的供应链经理认为,至少持续到20......
  • 模拟集成电路设计系列博客——8.4.1 全数字锁相环介绍
    8.4.1全数字锁相环介绍随着CMOS工艺的演进,数字电路的尺寸得到不断的微缩,工作电压不断的降低,这使得模拟PLL受到了许多挑战,如环路滤波器中无源器件尺寸庞大,即使在更先进的CMOS工艺下也无法缩小,如果改为片外器件又会引入额外噪声,并增加pad需求和PCB面积,如下图所示,一个典型的模拟PLL......
  • random实现一个验证码,可以是4位或者6位,可以是纯数字、数字+字母
    点击查看代码importrandomimportstringdefgenerate_str_num_code(length):characters=string.digits+string.ascii_letters#type--><class'str'>code=""foriinrange(length):code=code+random.choice(characters)#code=......
  • 图扑智慧农业——生态鱼塘数字孪生监控
    智慧农业园作为新型农业经营模式,正在以其高效、环保、可持续的特点受到广泛关注。智慧鱼塘作为智慧农业中一项关键技术,结合物联网、人工智能、云计算等技术,实现对新型养殖模式的实时监控、优化与管理。效果展示图扑软件应用自研HTforWeb产品,打造轻量化智慧生态鱼塘可视化解......