关于#c++#的问题:“设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算

 “设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算。”
oj上,要求已经实现了,但是提交上去说内存超限。
求解决方法。

img

代码

#include 
#include 
#include 
using namespace std;
 
typedef struct num 
{
    char data;        
    char point;        
    struct num* next;
}*list; 
list reverse(list);
list fill(list , list);    
int com(list, list, int);
list neg (list);    
list decimalPlus (list, list, list );
list fix (list);
void print (list);
int main() 
{
    char op;
    int x=0,n,i = 0;
    num *head1,*head2,*headA;
    head1 = new num;
    head1->next = NULL;
    head2 = new num;
    head2->next = NULL;
    headA = new num;
    headA->next = NULL;                        
    cin >> n;
    for (x = 0;x < n;x++)
    {
        cin >> op;
        fill (head1,head2);
        if (op == '-')
        {
            neg (head2);
            if (head2->next->data == 0)
                head2->next->data = 1;
            else
                head2->next->data = 0;
        }
        i = com(head1, head2, i);
        if (i == 1)
        {
            decimalPlus (head2,head1, headA );
        }
        else
        {    
            decimalPlus (head1,head2, headA );
        }
        fix (headA);
        print (headA);
        i = 0;
    }
        
}
    
list reverse(list head)
{
    if (head->next == NULL || head->next->next == NULL)
    {
        return head;
    }
 
    list t = NULL;
    list p = head->next;
    list q = head->next->next;
    while (q != NULL)
    {
        t = q->next;
        q->next = p;
        p = q;
        q = t;
    }
    head->next->next = NULL;
    head->next = p;
    return head;
}
 
list fill(list head1, list head2)
{    
    num *p, *q;
    char a;                                    
    int temp = 0, x=0, y=0, i=0, j=0;        
    cin >> a;
    p = head1;
    q = new num;
    q->next = NULL;
    p->next = q;
    p = q;
    if (a == '-')
    {
        q->data = 0;
        q->point = 0;
    }
    else
    {
        q->data = 1;
        q->point = 0;
        temp = 1;
    }
    q = new num;
    q->next = NULL;
    p->next = q;
    p = q;
    q->data = 0;
    q->point = 0;
    while(1)
    {
        if (temp != 1)
            cin >> a;
        temp = 0;
        if(a == '.')                        
        {
            i = 0;
            q->point = 2;
            continue;
        }
        if(a ==',')
        {
            q->point = 1;
            continue;
        }
        q = new num;
        q->next = NULL;
        p->next = q;
        p = q;
        q->data = a-48;                        
        q->point = 0;
        x++;
        i++;
        if(cin.get()== '\n')
        {
            if (i - x == 0)
                i = 0;
            break;
        }
        cin.unget();
    }
    if (head1->next->data == 0)            
    {
        neg(head1);
    }
    
    num *s, *t;
    temp = 0;
    cin >> a;
    s = head2;
    t = new num;
    t->next = NULL;
    s->next = t;
    s = t;
    if (a == '-')
    {
        t->data = 0;
        t->point = 0;
    }
    else
    {
        t->data = 1;
        temp = 1;
        t->point = 0;
    }
    t= new num;
    t->next = NULL;
    s->next = t;
    s = t;
    t->data = 0;
    t->point = 0;
    while(1)
    {
        if (temp != 1)
            cin >> a;
        temp = 0;
        if(a == '.')
        {
            j = 0;
            t->point = 2;
            continue;
        }
        if(a ==',')
        {
            t->point = 1;
            continue;
        }
        t = new num;
        t->next = NULL;
        s->next = t;
        s = t;
        t->data = a-48;
        t->point = 0;
        y++;
        j++;
        if(cin.get()== '\n')
        {
            if (j - y == 0)
                j = 0;
            break;
        }
        cin.unget();
    }
    if (head2->next->data == 0)
    {
        neg(head2);
    }
    if (i > j)                                    
    {
        for (;jt->next = NULL;
            s->next = t;
            s = t;
            t->data = 0;
            t->point = 0;
        }
    }
    else if (i < j)
    {
        for (;iq->next = NULL;
            p->next = q;
            p = q;
            q->data = 0;
            q->point = 0;
        }
    }                    
    return head1,head2;
}

int com(list head1, list head2, int i)
{
    list p = head1->next->next, q = head2->next->next;
    int x = 0,y = 0;
    while(p != NULL)
    {
        p = p->next;
        x++;
    }
    while(q != NULL)
    {
        q = q->next;
        y++;
    }
    if (x < y)
    {
        i = 1;
    }
    if (x == y)
    {
        list p = head1->next->next, q = head2->next->next;
        while(p != NULL)
        {
            if (abs(p->data) < abs(q->data))
            {
                i = 1;
                break;
            }
            p = p->next;
            q = q->next;
        }
    }
    return i;
}

list neg (list head)
{
    list p = head->next;
    while (p != NULL)
    {
        p->data = -p->data;
        p = p->next;
    }
    p = head->next;
    return head;
}

list decimalPlus (list head1, list head2, list headA )
{
    int temp = head1->next->data;
    if (temp == 0)
    {
        neg (head1);
        neg (head2);
    }
    head1->next->data = 0;
    head2->next->data = 0;
    reverse(head2);
    reverse(head1);
    list p,q;
    num *s, *t;
    s = headA;
    p = head1->next;
    q = head2->next;
    int a = p->data+q->data;
    t = new num;
    t->next = NULL;
    s->next = t;
    s = t;
    if (a >= 10)
        t->data = a-10;
    else if (a < 0)
        t->data = a+10;
    else
        t->data = a;
    if (q->point == 2 || p->point == 2 )
        t->point = 2;
    else
        t->point = 0;
    p = p->next;
    q = q->next;
    while(1)
    {
        t = new num;
        t->next = NULL;
        s->next = t;
        s = t;
        if (a >= 10)
            a = p->data+q->data + 1;
        else if (a < 0 )
            a = p->data+q->data - 1;
        else
            a = p->data+q->data;
        if (a >= 10)
            t->data = a-10;
        else if (a < 0)
            t->data = a+10;
        else
            t->data = a;
        if (q->point == 2 || p->point == 2 )
            t->point = 2;
        else
            t->point = 0;
        p = p->next;
        q = q->next;
        if (p->next == NULL || q->next == NULL)
            break;
        
    }
    while(p->next != NULL)
    {
        
        t = new num;
        t->next = NULL;
        s->next = t;
        s = t;
        if(a >= 10)
            t ->data = p ->data+1;
        else if (a < 0 )
            t ->data = p ->data-1;
        else 
            t ->data = p ->data;
        a = t ->data;
        if(a >= 10)
            t ->data = a-10;
        else if (a < 0)
            t ->data = a+10;
        t->point = p->point;
        p = p->next;
    }
    while(q->next != NULL)
    {
        
        t = new num;
        t->next = NULL;
        s->next = t;
        s = t;
        if(a >= 10)
            t ->data = q ->data+1;
        else if (a < 0)
            t ->data = q ->data-1;
        else 
            t ->data = q ->data;
        a = t ->data;
        if(a >= 10)
            t ->data = a-10;
        else if (a < 0)
            t ->data = a+10;
        t->point = q->point;
        q = q->next;
    }
    if ( temp == 0 )
    {
        neg (headA);
    }
    
    return headA;
}

list fix (list head)
{
    list p = head->next;
    int i = 0,x=1;
    while (p != NULL)
    {
        if (p->point == 2)
        {
            i = 1;
            break;
        }
        p = p->next;
    }
    if (i == 1)
    {
        p = head->next;
        while (p->point != 2)
        {
            if (p->data != 0)
                break;
            p = head->next;
            head->next = head->next->next;
            delete p;
            p = head->next;
        }
        p = head->next;
        while (p->point != 2)
        {
            p = p->next;
        }
        p = p->next;
        while (p != NULL)
        {
            if (x%3 == 0)
                p->point = 1;
            x++;
            p = p->next;
        }
        head->next->point = 0;
    }
    else
    {
        p = head->next;
        p = p->next;
        while (p != NULL)
        {
            if (x%3 == 0)
                p->point = 1;
            x++;
            p = p->next;
        }
    }
    reverse(head);
    p = head->next;
    while (p->point != 2)
        {
            if (p->data != 0)
                break;
            if (p->next == NULL)
                break;
            p = head->next;
            head->next = head->next->next;
            delete p;
            p = head->next;
        }
    return head;
}

void print (list head)
{
    list p;
    p = head->next;
    while (p != NULL)
    {
        if (p->data < 0)
        {
            cout << "-";
            break;
        }
        p = p->next;
    }
    p = head->next;
    while (p != NULL)
    {
        cout << abs(p->data);
        if (p->point ==1)
            cout << ",";
        if (p->point ==2)
            cout << ".";
        p = p->next;
    }
    delete p;
    cout << endl;
}


C++使用双向循环链表实现两个任意长的整数运算,运算快,占用内存小
链表实现逻辑图解:

img


参考这位大神,源码和实现的步骤都给出来了,可以直接用
https://blog.csdn.net/qq_43342413/article/details/104843924

设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算,并且能通过OJ的测试用例,可能需要考虑以下几点:

整数的存储方式:在计算两个任意长度的整数时,可以使用链表或者数组来存储整数,这样可以避免内存超限问题。

精度控制:在计算任意精度实数时,需要控制精度,避免精度过高导致内存超限。

内存优化:在程序中需要注意内存使用情况,尽量避免内存浪费,如果程序中有大量的中间变量,尽量在每次使用完之后立即释放。

时间复杂度优化:在实现算术运算时,尽量使用时间复杂度较低的算法,如果程序中有重复计算的部分,可以考虑使用记忆化技术优化。

建议根据上述建议逐一检查并修改代码,并再次提交试试。如果仍然无法通过OJ的测试用例,可以尝试在论坛或者博客上寻求帮助。

计算一下1.0/3.0试试?
任意精度,吹,继续吹。


#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

const int MAXN = 2005;
const int INF = 0x3f3f3f3f;

int add(int* a, int* b, int* c) {
    int len = max(a[0], b[0]);
    int x = 0;
    for (int i = 1; i <= len; i++) {
        c[i] = a[i] + b[i] + x;
        x = c[i] / 10;
        c[i] %= 10;
    }
    if (x) c[++len] = x;
    c[0] = len;
    return len;
}

int sub(int* a, int* b, int* c) {
    int len = a[0];
    int x = 0;
    for (int i = 1; i <= len; i++) {
        c[i] = a[i] - b[i] - x;
        if (c[i] < 0) {
            c[i] += 10;
            x = 1;
        } else x = 0;
    }
    while (c[len] == 0) len--;
    c[0] = len;
    return len;
}