大数加法分析及C语言实现(加数可为负数)

本文详细分析了大数加法的各种情况,包括同号和异号加法,并给出了C语言实现的处理流程,包括将大数转换为字符串、判断符号、调用加法或减法函数进行计算,最后输出结果。
摘要由CSDN通过智能技术生成

大数加法(加数可为负数)


·分析:

大数加法有如下几种情况:
1.两数同号
(1)同正:如,s1=11,s2=22;s1=0,s2=0
(2)同负:如,s1=-11,s2=-22
2.两数异号
(1)正数加负数:如,s1=11,s2=-9
  1)s1的长度大于s2绝对值的长度:如,s1=11,s2=-9
  2)s1和s2绝对值的长度相等但s1大于等于s2的绝对值:s1=106,s2=-104;s1=11,s2=-11
  3)s1的长度小于s2绝对值的长度:如,s1=9,s2=-11
  2)s1和s2绝对值的长度相等但s1小于s2的绝对值:s1=104,s2=-106
(2)负数加正数:如,s1=-9,s2=11
    位置转换可变换为“正数加负数”形式


处理:

首先,将大数以字符串形式输入
其次,判断s1与s2符号,调用不同函数处理
(1)同号:调用Plus函数
   1)如果同正,设置标志结果符号的flag为0,将两个字符串转化为数组形式倒序存储
   2)如果同负,设置标志结果符号的flag为1,将两个字符串转化为数组形式倒序存储,但不存储两字符串的第0位(因为第0位为负号)
   3)将两数组对应位相加,位数满10进1
   4)根据flag值输出结果的符号
   5)判断最高位是否为0,输出结果数组
(2)异号:调用Minus函数
   1)调用函数时以正数-负数顺序传递实参给形参,即s1为正数,s2为负数
   2)将两个字符串转化为数组形式倒序存储,但不存储s2字符串的第0位(因为s2[0]为负号)
   3)判断结果符号,根据两数大小,有两种情况:
     1)s1的长度大于s2的长度或s1和s2长度相等但s1大于等于s2,即:
           len1>(len2-1) 或 len1==(len2-1),s1>=s2 做num1-num2,设置flag=0,标志得正数
     2)s1的长度小于s2的长度或s1和s2长度相等但s1小于s2,即:
           len1<(len2-1)或 len1==(len2-1),s1<s2 做num2-num1,设置flag=1,标志得负数
     3)调用Minus_show函数
           - 对传进来的num1-num2或num2-num1做减法计算
           - 将两数组对应位相减,位数不够减向前借1
           - 根据flag值输出结果的符号
           - 判断最高位是否为0,输出结果数组


实现:

#include<stdio.h>
#include<string.h>
char s1[10005],s2[10005],s3[10005];
int num1[10005],num2[10005];
int len1,len2,i,j;

//当s1与s2同号,利用flag标志结果的符号(0为正,1为负)
void Plus(int flag)
{
   
    len1=strlen(s1);
    len2=strlen(s2);
    for(i=len1-1,j=0; i>=0 ; i--)
    {
   
        num1[j]=s1[i]-48;
        j++;
        if(i==flag) break; //如果s1与s2同负,flag=1,则不进行下一次循环赋值字符串第0位
    }
    for(i=len2-1,j=0; i>=0 ; i--)
    {
   
        num2[j]<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值