Description
本题做一些简化,题目要求改为输入两个正整数,输出两个正整数的和。
Input Format
输入文件包括两行。
第一行包括一个正整数,保证位数不超过1000000。
第一行包括一个正整数,保证位数不超过1000000。
Output Format
输出文件包括一行。
第一行包括一个正整数。
Sample Input
10558
22
Sample Output
10580
Limits
1.请使用链表答题,否则代码分给0分。
2.请存储下来两个正整数的和,否则代码分给0分。
较好版本,通过测评,测评地址:http://acm.sjtu.edu.cn/OnlineJudge/problem/1202
#define _CRT_SECURE_NO_DEPRECATE
#include
#include
using namespace std;
class list {
struct node {
int data;
node *next, *pre;
node(int d,node *n=NULL,node* p=NULL) {
data = d;
next = n;
pre = p;
}
node() { next = NULL; pre = NULL; }
};
node *head, *rear;
public:
list() {
head = new node;
rear = new node;
head->next =rear;
rear->pre = head;
}
void insert(int n) {
node *temp;
temp = new node(n, head->next, head);
temp->next->pre = temp;
temp->pre->next = temp;
}
list add(list num2) {
node *num1_temp = head->next;
node *num2_temp = num2.head->next;
int carry = 0;
list result;
while ((num1_temp->next != NULL) || (num2_temp->next != NULL)) {
int t1, t2;
if (num1_temp->next == NULL)t1 = 0;
else { t1 = num1_temp->data; num1_temp = num1_temp->next; }
if (num2_temp->next == NULL)t2 = 0;
else { t2 = num2_temp->data; num2_temp = num2_temp->next; }
result.insert((t1 + t2 + carry) % 10);
carry = (t1 + t2 + carry) / 10;
}
if (carry == 1) result.insert(carry);
return result;
}
void print() {
node*temp = head->next;
while (temp->next != NULL) {
printf("%d", temp->data);
temp = temp->next;
}
}
};
int main() {
char a[1000000], b[1000000];
scanf("%s", a);
scanf("%s", b);
list num1, num2;
for (int i = 0; i < 1000000 && a[i] != '\0'; ++i) {
num1.insert((a[i]-'0'));
}
for (int i = 0; i <1000000 && b[i] != '\0'; ++i) {
num2.insert((b[i] - '0'));
}
list result = num1.add(num2);
result.print();
}
两个点错误,原因未知。
#define _CRT_SECURE_NO_DEPRECATE
#include
#include
using namespace std;
class list {
struct node {
int data;
node *next, *pre;
node(int d,node *n=NULL,node* p=NULL) {
data = d;
next = n;
pre = p;
}
node() { next = NULL; pre = NULL; }
};
node *head, *rear;
public:
list() {
head = new node;
rear = new node;
head->next =rear;
rear->pre = head;
}
void insert(int n) {
node *temp;
temp = new node(n, head->next, head);
temp->next->pre = temp;
temp->pre->next = temp;
}
list add(list num2) {
node *num1_temp = head->next;
node *num2_temp = num2.head->next;
int carry = 0;
list result;
while ((num1_temp->next!= NULL) && (num2_temp->next!= NULL)) {
if (num1_temp->data + carry + num2_temp->data >= 10) { result.insert(num1_temp->data + carry + num2_temp->data - 10); carry = 1;
}
else { result.insert(num1_temp->data + carry + num2_temp->data); carry = 0;
}
num1_temp = num1_temp->next;
num2_temp = num2_temp->next;
}
if (num1_temp->next == NULL&&num2_temp->next!= NULL) {
while (num2_temp->next != NULL) {
if (num2_temp->data + carry == 10) {
result.insert(0); carry = 1;
}
else {
result.insert(num2_temp->data); carry = 0;
}
num2_temp = num2_temp->next;
}
if (carry == 1) result.insert(1);
}
else if (num1_temp->next != NULL&&num2_temp->next == NULL) {
while (num1_temp->next != NULL) {
if (num1_temp->data + carry == 10) {
result.insert(0); carry = 1;
}
else {
result.insert(num1_temp->data); carry = 0;
}
num1_temp = num1_temp->next;
}
if (carry == 1) result.insert(1);
}
else {
if (carry == 1) result.insert(1);
}
return result;
}
void print() {
node*temp = head->next;
while (temp->next != NULL) {
printf("%d", temp->data);
temp = temp->next;
}
}
};
int main() {
char a[2000000], b[2000000];
scanf("%s", a);
scanf("%s", b);
list num1, num2;
for (int i = 0; i < 2000000 && a[i] != '\0'; ++i) {
num1.insert((a[i]-'0'));
}
for (int i = 0; i <2000000 && b[i] != '\0'; ++i) {
num2.insert((b[i] - '0'));
}
list result = num1.add(num2);
result.print();
}