长整数四则运算_双向循环链表
长整数四则运算_双向循环链表
[ 问题描述 ]
设计程序实现两个任意长整数的求和运算。
[ 基本要求 ]
利用双向循环链表实现长整数的存储, 每个结点含一个整型变量. 任何整型变量的范围是 -(215-1)~(215-1)。输入和输出形式: 按中国对于长整数的表
示习惯, 每四位一组,组间用逗号隔开。
[ 测试数据 ]
(1) 0;0;应输出"0"。
(2) -2345,6789;-7654,3211; 应输出"-1,0000,0000"。
(3) -9999,9999; 1,0000,0000,0000; 应输出"9999,0000,0001"。
(4) 1,0001,0001; -1,0001,0001; 应输出"0"。
(5) 1,0001,0001; -1,0001,0000; 应输出"1"。
[ 实现提示 ]
(1) 每个结点可以存放的最大整数为 215-1 = 32767 才能保证两数相加不会溢出。但若这样存,即相当于按 32768 进制数存,在十进制数与32768 进制数间
的转换十分不方便,故可以在每个结点中仅存十进制数的4 位,即不超过9999的非负整数, 整个链表被视为万进制。
(2)可以利用头结点数据域的符号代表长整数的符号。 用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数
组中是简化程序结构的一种方法。不能给长整数位数规定上限。
vs2019代码
代码片
.
// An highlighted block
// ConsoleApplication10.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct Node {
int num;
struct Node* prior;
struct Node* next;
}list;
char init(list* body, char ch, int ten) {
if (ch == ',') {
return',';
}
else if (ch >= '0' && ch <= '9')
{
int x = int(ch - '0');
body->num = body->num + x * ten;
scanf_s("%c",&ch);
if (ch == ',')body->num /= ten;
if (ch == ';') {
body->num /= ten;
return ';';
}
ten /= 10;
init(body, ch, ten);
}
}
list * xiangjia(list * head, list * head1, list * head2) {
int a1 = head1->num;
int a2 = head2->num;
int flag=1;
while (head1->next!=NULL)
{
head1 = head1->next;
}
while (head2->next != NULL)
{
head2 = head2->next;
}
while (head1->prior != NULL && head2->prior != NULL)
{
head->num = a1*(head1->num) + a2*(head2->num) + head->n