1202 BigInt


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();
	
}
    
    
   
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值