题目描述
设计一个程序实现两个任意长的数(包括正数和负数)、任意精度实数的加减运算,其中以“-”号开头的为负数。
输入
第一行为一个数字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;
}