“设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算。”
oj上,要求已经实现了,但是提交上去说内存超限。
求解决方法。
代码
#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++使用双向循环链表实现两个任意长的整数运算,运算快,占用内存小
链表实现逻辑图解:
设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算,并且能通过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;
}