大整数加减法

#include<cstdio>
#include<cstring>

using namespace std;

void bigAdd(char a[],char b[],char res[])
{
    int lena = strlen(a) - 1;
    int lenb = strlen(b) - 1;
    int index = 0;
    int k = 0;//保留进位
    while(lena >= 0 && lenb >= 0)
    {
        res[index] = a[lena] + b[lenb] + k - 48;//注意-48
        k = 0;
        if(res[index] > '9')
        {
            res[index] -= 10;
            k = 1;
        }
        --lena;
        --lenb;
        ++index;
    }
    if(lena < 0)
    {
        while(lenb >= 0)
        {
            res[index] = b[lenb] + k;
            k = 0;
            if(res[index] > '9')
            {
                res[index] -= 10;               
                k = 1;
            }
            --lenb;
            ++index;
        }
    }
    else if(lenb < 0)
    {   
        while(lena >= 0)
        {
            res[index] = a[lena] + k;
            k = 0;
            if(res[index] > '9')
            {
                res[index] -= 10;               
                k = 1;
            }
            --lena;
            ++index;    
        }
    }
    if(k == 1)//处理边界值
    {
        res[index] = '1';
    }
}

void bigMinus(char a[],char b[],char res[])//提前保证a大于b
{
    int lena = strlen(a) - 1;
    int lenb = strlen(b) - 1;
    int index = 0;
    int k = 0;

    while(lenb >= 0)
    {
        res[index] = a[lena] - b[lenb] - k +48;
        k = 0;
        if(res[index] < 48)
        {
            res[index] += 10;
            k = 1;
        }
        ++index;
        --lena;
        --lenb;
    }
    while(lena >= 0)
    {
        res[index] = a[lena] - k;
        k = 0;
        if(res[index] < 48)
        {
            res[index] += 10;
            k = 1;
        }       
        ++index;
        --lena;         
    }
    //输出结果时操作可以去掉前面的0。
}

int main()
{
    char a[100];
    char b[100];
    char res[105];
    int i;
    while(1)
    {
        memset(res,0,sizeof(res));
        scanf("%s %s",a,b);
        bigMinus(a,b,res);
        i = strlen(res);
        while(i--)
        {
            printf("%c",res[i]);
        }   
        printf("\n");   
    }

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链表实现大整数加减法操作的思路如下: 1. 将两个大整数转换成链表,每个节点存储一个数字。 2. 遍历两个链表,从低位到高位逐一相加或相减两个节点的值,得到当前位的结果。 3. 如果相加或相减后的结果超过了10,需要将进位或借位记录下来,作为下一次计算的额外数值。 4. 如果两个链表长度不一致,需要先将短的链表用0节点补齐长度。 5. 最后得出的结果可能包含前导0,需要去除。 6. 将最终结果转换成链表返回。 下面是基于Python语言实现的代码,具体注释见代码中: ``` class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode: # 建立哑节点,简化边界条件判断 dummy = ListNode(0) curr = dummy carry = 0 # 进位值 while l1 or l2: # 取出两个链表当前节点的值,如果没有节点则默认为0 val1 = l1.val if l1 else 0 val2 = l2.val if l2 else 0 # 计算当前位的和,加上上一次进位值 total = carry + val1 + val2 # 计算当前位的进位值,如果有则为1,否则为0 carry = 1 if total >= 10 else 0 # 计算当前位的实际值 curr.next = ListNode(total % 10) curr = curr.next # 遍历两个链表 if l1: l1 = l1.next if l2: l2 = l2.next # 判断最高位是否有进位值 if carry > 0: curr.next = ListNode(carry) return dummy.next def subTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode: # 建立哑节点,简化边界条件判断 dummy = ListNode(0) curr = dummy borrow = 0 # 借位值 while l1 or l2: # 取出两个链表当前节点的值,如果没有节点则默认为0 val1 = l1.val if l1 else 0 val2 = l2.val if l2 else 0 # 计算当前位的差,减去上一次借位值 sub = val1 - val2 - borrow # 计算当前位的借位值,如果有则为1,否则为0 borrow = 1 if sub < 0 else 0 # 计算当前位的实际值 curr.next = ListNode((sub + 10) % 10) curr = curr.next # 遍历两个链表 if l1: l1 = l1.next if l2: l2 = l2.next # 判断最高位是否有借位值 if borrow > 0: curr.next = ListNode(borrow) # 去除前导0 while dummy.next and dummy.next.val == 0: dummy.next = dummy.next.next return dummy.next ``` 使用样例: ``` # 两个大整数相加 l1 = ListNode(2, ListNode(4, ListNode(3))) l2 = ListNode(5, ListNode(6, ListNode(4))) result = addTwoNumbers(l1, l2) while result: print(result.val) result = result.next # 输出:7 0 8 # 两个大整数相减 l3 = ListNode(9, ListNode(2, ListNode(3))) l4 = ListNode(5, ListNode(6, ListNode(4))) result = subTwoNumbers(l3, l4) while result: print(result.val) result = result.next # 输出:3 6 9 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值