本学期数据结构课程设计的第一个作业。
初步想法:
使用 F F T FFT FFT优化乘法
设 n n n为大数的位数。
则乘法复杂度: O ( n 4 l o g ( n 4 ) ) O(\frac{n}{4}log(\frac{n}{4})) O(4nlog(4n))
(压位处理,其中链表每一个节点存储四位数据)
除法则枚举答案的每一位,按位更新,复杂度 O ( n 2 16 ) O(\frac{n^2}{16}) O(16n2)
代码:(详细注释)
#include<cstdio>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef int ElemType;
#define OK 1;
#define Error 0;
#define Wrong -1;
#define Over_Flow 0;
//双向循环链表实现部分
class LinkNode{
//链表结点
public:
ElemType data;
LinkNode *next,*prev;
};
class LinkList{
//带头节点的双向循环链表
public:
LinkNode *head;
int len;
};
void InitList(LinkList &L){
//初始化链表
L.len = 0;
L.head = new LinkNode;
L.head->next = L.head->prev = L.head;
}
void ClearList(LinkList &L){
//清空链表
LinkNode *p = L.head->next,*q;
while(p != L.head){
q = p->next;
delete p;
p = q;
}
L.head->next = L.head->prev = L.head;
L.len = 0;
}
void DestroyList(LinkList &L){
//销毁链表
ClearList(L);
delete L.head;
L.head = NULL;
}
bool ListEmpty(LinkList &L){
//判断链表是否为空
if(L.len) return false;
else return true;
}
ElemType ListLength(LinkList& L){
//求链表长度
return L.len;
}
bool InsertList(LinkList& L,ElemType data,int pos){
//在链表的第pos个位置之后插入数据data
if(pos<0 || pos>L.len) return Error; // 0 <= pos <= L.len
LinkNode *p = L.head;
if(pos <= L.len-pos+1){
//通过后继寻找位置
for(int i=1 ;i<=pos ;i++){
if(p == NULL) return Error;
p = p->next;
}
}
else{
//通过前驱寻找位置
for(int i=1 ;i<=L.len-pos+1 ;i++){
if(p == NULL) return Error;
p = p->prev;
}
}
LinkNode *q = new LinkNode;
q->data = data;
q->next = p->next;
q->prev = p;
p->next->prev = q;
p->next = q;
L.len++;
return OK;
}
bool QueryList(LinkList& L,int pos,ElemType& e){
//询问链表第pos个位置的值,通过e返回
if(pos<1 || pos>L.len) return Error; // 1 <= pos <= L.len
LinkNode *p = L.head;
if(pos <= L.len-pos+1){
//通过后继寻找位置
for(int i=1 ;i<=pos ;i++){
if(p == NULL) return Error;
p = p->next;
}
}
else{
//通过前驱寻找位置
for(int i=1 ;i<=L.len-pos