大数相加的问题

 

数相加的问题我是今年的5月份的时候曾经写过相关的代码,但是今天用到的时候却编译怎么也通不过去,后来发现在初始化的时候发现了错误,不过整体而言,大数相加是大数运算中应该是最简单的一种了吧。只需注意进位即可,还有就是用字符串来处理(估计是废话,因为谁都知道),那么我们需要注意的又是什么呢,当然,注意的就是细节问题,首先我们应该对输入的字符进行倒置,为什么这样做,想想小学时你是怎么运算的就应该知道了,还有就是进位,这两个应该是关键的两点,剩下的就是输出,想想输出应该怎么输出,需要注意下什么。好了,我用5月份的在hdoj上做的题来说明这个问题吧,想通了还是很简单,我直接上代码,不懂的再问。

C语言: Codee#14290
#include <stdio.h>
#include <string.h>
int main()
{
    char a [ 1000 ],b [ 1000 ], c [ 1000 ], d [ 1000 ];
    int n , l1 , l2 , i , j , k = 1 , m;
    scanf( "%d" , &n);
    m =n;
    while(n --)
    {   
        j = 0;
        memset( a , '/0' , sizeof( a));
        memset(b , '/0' , sizeof(b));
        memset( c , '/0' , sizeof( c));
        memset( d , '/0' , sizeof( d));
        scanf( "%s%s" , a ,b);
        l1 = strlen( a);
        l2 = strlen(b);
        for( i = l1 - 1; i >= 0; i --)
        {
            c [ j ++ ] = a [ i ] - '0';
        }
        j = 0;
        for( i = l2 - 1; i >= 0; i --)
        {
            d [ j ++ ] =b [ i ] - '0';
        }
        if( l1 < l2) l1 = l2;
        for( i = 0; i < l1; i ++)
        {
            c [ i ] += d [ i ];
            if( c [ i ] >= 10)
            {
                c [ i ] = c [ i ] - 10;
                c [ i + 1 ] ++;
            }
        }
        printf( "Case %d: /n " , k ++);
        printf( "%s + %s = " , a ,b);

        for( i = l1 - 1; i >= 0; i --)
            printf( "%d" , c [ i ]);
        printf( " /n ");
        if( k != m + 1)
            printf( " /n ");
    }
    return 0;
}

大数相加通常是指处理超出标准数据类型(如int、long等)范围的大整数相加问题,在C语言可以采用数组或字符串的方式来处理。当数值过大无法直接存储在整型变量,我们可以创建两个字符数组分别存储每一位数字,并按照从低位到高位的方式逐位相加。 小数相加同样如此,由于浮点数有精度限制,处理大数值的小数部分需要特别注意溢出和精度损失的问题。一种常见的方法是使用double类型的变量存储,然后手动处理小数点后的操作。 以下是简单的示例代码: ```c #include <stdio.h> #include <string.h> // 函数声明 void addLargeNumbers(char *a, char *b, int len_a, int len_b); // 辅助函数,用于处理单个位数相加并考虑进位 char sumAndCarry(char a, char b) { int sum = a + b - '0'; return (sum > 9) ? (sum - 10 + '0') : sum + '0'; } // 主函数 void addLargeNumbers(char *a, char *b, int len_a, int len_b) { int i = 0, carry = 0; char result[len_a + len_b + 1]; // 空余一位放进位 while (i < len_a || i < len_b) { if (i < len_a) result[i] = a[len_a - 1 - i]; if (i < len_b) result[i] += carry + b[len_b - 1 - i] - '0'; carry = result[i] / 10; // 计算进位 result[i] = result[i] % 10; // 取结果的最后一位 ++i; } // 如果还有进位,添加到结果的最前面 if (carry != 0) result[0] = carry + '0'; result[len_a + len_b] = '\0'; // 结束标志 printf("Result: %s\n", result); } int main() { char largeNum1[] = "12345678901234567890"; char largeNum2[] = "98765432109876543210"; int len1 = strlen(largeNum1); int len2 = strlen(largeNum2); addLargeNumbers(largeNum1, largeNum2, len1, len2); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值