大数加减法含小数C++(求助帖)

题目描述

设计一个程序实现两个任意长的数(包括正数和负数)、任意精度实数的加减运算,其中以“-”号开头的为负数。

输入

第一行为一个数字n,表示待计算的组数。接下来为3n行内容。每组内容有3行,第一行表示做加法还是减法,第二、三行为两个数字,每次取一组内容来计算。

输出

共有n行,每行要换行,小数末属不保留0,若小数点后都为0,则不要小数点。

一次样例输入

4

+

1,111,111,111,111,111,111,111,111,111,111,111,111

222,222,222,222,222,222,222,222,222,222,222,222

+

-12,345,678,901,234,567,890,123,456,788,012,345,678,901,234,567,890

98,765,432,198,765,432,198,765,432,198,765,432,198,765,432,198,765

+

3.14159265358979384626

6.66666666666666666666666

-

-41,829,471,284,124,414.49104801248981284

-64,580,569,452,374,277.12783183148912947

一次样例输出

1,333,333,333,333,333,333,333,333,333,333,333,333

86,419,753,297,530,864,308,641,975,409,753,086,519,864,197,630,875

9.80825932025646051292666

22,751,098,168,249,862.63678381899931663

为什么我的代码是AC:50%???

#include <iostream>
#include <string>
using namespace std;

struct Node
{
    int data;
    Node *next;
    Node() : next(nullptr) {}
    Node(int data) : data(data), next(nullptr) {}
    Node(const Node &temp) : data(temp.data), next(nullptr) {}
};

class LinkList
{
public:
    Node *head;
    int length;

    LinkList()
    {
        head = new Node();
        length = 0;
    }
    ~LinkList()
    {
        while (head != nullptr)
        {
            Node *p = head->next;
            delete head;
            head = p;
        }
    }
    void insert(int data)
    {
        Node *temp = new Node(data);
        temp->next = head->next;
        head->next = temp;
        length++;
    }
};

void Add(LinkList &link_one, LinkList &link_two, LinkList &link_three)
{
    int temp = 0, i, m, n;
    n = link_one.length;
    m = link_two.length;
    Node *p = link_one.head->next, *q = link_two.head->next;
    for (i = 0; i < n && i < m; i++)
    {
        int data = p->data + q->data + temp;
        temp = data / 10;
        link_three.insert(data % 10);
        p = p->next;
        q = q->next;
    }
    for (; i < n; i++)
    {
        int data = p->data + temp;
        temp = data / 10;
        link_three.insert(data % 10);
        p = p->next;
    }
    for (; i < m; i++)
    {
        int data = q->data + temp;
        temp = data / 10;
        link_three.insert(data % 10);
        q = q->next;
    }
    if (temp != 0)
        link_three.insert(1);
}

void Display(const LinkList &link, size_t l)
{
    Node *temp = link.head->next;
    int top = 0;
    int k = 0;
    string str1, str2, str;
    while (temp != nullptr)
    {
        str += to_string(temp->data);
        temp = temp->next;
    }
    str1 = str.substr(0, str.length() - l);
    if (l != 0)
        str2 = str.substr(str.length() - l, l);

    auto len = str1.length();
    string str3;
    for (int i = len - 1; i >= 0; i--)
    {
        str3 += str1[i];
        k++;
        if (k % 3 == 0 && i != 0)
        {
            str3 += ",";
        }
    }
    for (int i = str3.length() - 1; i >= 0; i--)
    {
        cout << str3[i];
    }
    if (l == 0)
        return;
    cout << ".";
    auto len2 = str2.length();
    for (int i = 0; i < len2; i++)
    {
        cout << str2[i];
    }
}

void Sub(LinkList &link_one, LinkList &link_two, LinkList &link_three)
{
    size_t len1 = link_one.length, len2 = link_two.length;
    if (len1 < len2)
    {
        Sub(link_two, link_one, link_three);
        cout << "-";
        return;
    }
    else if (len1 == len2)
    {
        Node *p = link_one.head->next, *q = link_two.head->next;
        while (p != nullptr && q != nullptr)
        {
            if (p->data < q->data)
            {
                Sub(link_two, link_one, link_three);
                cout << "-";
                return;
            }
            else if (p->data > q->data)
                break;
            p = p->next;
            q = q->next;
        }
    }

    int i, n, m;
    n = link_one.length;
    m = link_two.length;
    Node *p = link_one.head->next, *q = link_two.head->next;
    for (i = 0; i < m; i++)
    {
        int cache;
        cache = (p->data) - (q->data);
        if (cache < 0)
        {
            p->next->data -= 1;
            cache += 10;
        }
        link_three.insert(cache);
        p = p->next;
        q = q->next;
    }
    for (; i < n; i++)
    {
        int cache = p->data;
        if (cache < 0)
        {
            p->next->data--;
            cache += 10;
        }
        if (p->next == nullptr && p->data == 0)
            break;
        link_three.insert(cache);
        p = p->next;
    }
}

int main()
{
    int k = 0;
    cin >> k;
    while (k-- > 0)
    {
        LinkList link_one, link_two, link_three;
        char op, num1op, num2op;

        string num1, num2;
        cin >> op >> num1 >> num2;
        if (num1[0] == '-')
        {
            num1op = '-';
            num1.erase(0, 1);
        }
        else
        {
            num1op = '+';
        }
        if (num2[0] == '-')
        {
            num2op = '-';
            num2.erase(0, 1);
        }
        else
        {
            num2op = '+';
        }

        size_t len1 = 0, len2 = 0;
        if (num1.find('.') != string::npos)
        {
            len1 = num1.length() - num1.find('.') - 1;
        }
        if (num2.find('.') != string::npos)
        {
            len2 = num2.length() - num2.find('.') - 1;
        }
        std::size_t len = std::max(len1, len2);
        if (len1 != 0 || len2 != 0)
        {
            if (len == len1)
            {
                for (int i = 0; i < len - len2; i++)
                {
                    num2 += '0';
                }
            }
            else
            {
                for (int i = 0; i < len - len1; i++)
                {
                    num1 += '0';
                }
            }
        }

        len1 = len2 = 0;
        for (int i = 0; i < num1.length(); i++)
        {
            if (isdigit(num1[i]))
            {
                link_one.insert(num1[i] - '0');
                len1++;
            }
        }
        for (int i = 0; i < num2.length(); i++)
        {
            if (isdigit(num2[i]))
            {
                link_two.insert(num2[i] - '0');
                len2++;
            }
        }

        if (op == '+')
        {
            if (num1op == '+' && num2op == '+')
            {
                Add(link_one, link_two, link_three);
            }
            else if (num1op == '-' && num2op == '-')
            {
                Add(link_one, link_two, link_three);
                cout << "-";
            }
            else if (num1op == '+' && num2op == '-')
            {
                Sub(link_one, link_two, link_three);
            }
            else if (num1op == '-' && num2op == '+')
            {
                Sub(link_two, link_one, link_three);
            }
        }
        else if (op == '-')
        {
            if (num1op == '+' && num2op == '+')
            {
                Sub(link_one, link_two, link_three);
            }
            else if (num1op == '-' && num2op == '-')
            {
                Sub(link_two, link_one, link_three);
            }
            else if (num1op == '+' && num2op == '-')
            {
                Add(link_one, link_two, link_three);
            }
            else if (num1op == '-' && num2op == '+')
            {
                Add(link_one, link_two, link_three);
                cout << "-";
            }
        }
        Display(link_three, len);
        cout << endl;
    }
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值