数据结构课设之大整数四则运算 - 范文中心

数据结构课设之大整数四则运算

04/17

去年写的一个大整数四则运算课设,现在自己竟然忘得一干二净了,也不知道再次写还能不能写出来,真是悲催

当时老师要求真变态,不能用系统自带的栈,数组去存数,必须自己写个栈和用链表去存大数

main:

[cpp]view plaincopyprint?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include"calculate.h"

#define INF 99999999

using namespace std;

const int MAX=10;

typedef struct stack{

int *date;//存大数

char ch;

int mark;//mark用来标记符号:正负

stack *next;

stack(){

next=NULL,mark=1;

}

};

typedef struct head{

stack *top;

int size;

head(){

top=NULL,size=0;

}

void push(stack* &p);

void Clear();

void Pop();

};

head stack_dou,stack_ch;//一个用来存数字,一个用来存运算符.

void output(stack* &p){

cout

int l=p->date[0];

if(p->date[l] != 0 && p->mark == -1)cout

coutdate[l];

for(int i=l-1;i>=1;--i)coutdate[i];

cout

}

bool isoperator(char s){//判断运算符s是否符合条件.

if(s == '+' || s == '-' || s == '*' || s == '/' || s == '(' || s == ')')return true;

return false;

}

void head::push(stack* &p){//元素入栈.

p->next=this->top;

this->top=p;

this->size++;

}

void head::Pop(){//删除栈顶元素.

stack *p=this->top;

this->top=this->top->next;

this->size--;

delete p;

}

void head::Clear(){//清空栈.

while(this->top){

stack *p=this->top;

this->top=this->top->next;

delete p;

}

this->size=0;

}

bool stack_dou_calculate(char s){//s代表运算符,对实数栈的栈顶两个元素进行运算.

if(stack_dou.size

int *second=stack_dou.top->date,mark2=stack_dou.top->mark;

stack_dou.top->date=NULL;stack_dou.Pop();

int *first=stack_dou.top->date,mark1=stack_dou.top->mark;

stack_dou.top->date=NULL;stack_dou.Pop();

int *sum=new int[100];

if(s == '+' && mark1*mark2 == 1 ||

(s == '-' && mark1*mark2 == -1))add(first,second,sum);//相加

if(s == '-' && mark1*mark2 == 1){//相减

if(cmp(first,second))sub(first,second,sum);

else {sub(second,first,sum);mark1=-1*mark2;}

}

if(s == '+' && mark1*mark2 == -1){//相减

if(cmp(first,second))sub(first,second,sum);

else {sub(second,first,sum);mark1=mark2;}

}

if(s == '*')mult(first,second,sum);//相乘

if(s == '/')div(first,second,sum);//相除

stack *p=new stack;

p->date=sum;

p->mark=mark1;

stack_dou.push(p);

delete first;

delete second;

return true;

}

bool cmp(char a,char b){//比较运算符a,b的优先级.

if(b == '+' || b == '-' || a== '*' || a == '/' || b == ')' || a == '(')return true;

return false;

}

void calculate(string s){//计算表达式s.

string a;

for(int i=0;i

if(s[i] == ' '){if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();}continue;}

if(isdigit(s[i]))a+=s[i];

else if(isoperator(s[i])){

if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();}

while(stack_ch.top && cmp(stack_ch.top->ch,s[i])){

if(stack_ch.top->ch != '('){

if(!stack_dou_calculate(stack_ch.top->ch))break;

stack_ch.Pop();

}

else {stack_ch.Pop();break;}

}

if(s[i] != ')'){stack *p=new stack;p->ch=s[i];stack_ch.push(p);}

}

else{cout

}

if(a.size()){stack *p=new stack;p->date=new int[100];trans(a,p->date);stack_dou.push(p);a.clear();}

while(stack_ch.top){

if(!stack_dou_calculate(stack_ch.top->ch))break;

stack_ch.Pop();

}

if(stack_dou.size == 1 && stack_ch.size == 0)

output(stack_dou.top);

else cout

}

int main(){

string s;

cout

while(getline(cin,s)){//输入表达式s.

calculate(s);//计算表达式s.

stack_dou.Clear();//清空实数栈.

stack_ch.Clear();//清空字符栈.

cout

}

return 0;

}

/*

2+3*4+5

[***********][***********]2+[***********][**************]1

[***********][1**********]222*[***********][**************]

[***********][***********][***********][***********]1*[***********][***********]00000000

[***********][***********]-[***********]888+[**************]7/[1**********]22

[***********][***********]66/2222222

(2+3)*[***********][***********]000

1111-[***********]22222

1-2+3*6-(2+4)

5+6/9*7/2

*/

head:

[cpp]view plaincopyprint?

#include

#include

using namespace std;

//******************************************************************************

const int Base=10000,seg=4;

//******************************************************************************

void trans(string ch,int *s){//将字符串转化为数字

int i,k=1;

int L=ch.size()-seg;

for(i=L;i>=0;i-=seg,k++){//从字符串后面开始,依次四位四位存入整型数组.

s[k]=ch[i]-'0';

for(int j=i+1;j

s[k]=s[k]*10+ch[j]-'0';

}

}

i+=seg;

s[k]=0;

for(int j=0;j

s[k]=s[k]*10+ch[j]-'0';

}

if(s[k])s[0]=k;//s[0]储存该数组的位数.

else s[0]=k-1;

}

//******************************************************************************

void add(int *A,int *B,int *sum){//大整数相加

int la=max(A[0],B[0]),i,c=0;

for(int i=A[0]+1;i

for(int i=B[0]+1;i

for(i=1;i

sum[i]=A[i]+B[i]+c;

if(sum[i]>=Base){

c=sum[i]/Base;

sum[i]%=Base;

}else c=0;

}

if(c>0){

sum[i]=c;

sum[0]=i;

}

else sum[0]=i-1;

}

//******************************************************************************

void sub(int *A,int *B,int *sum){//大数相减

int c=0;

for(int i=B[0]+1;i

for(int i=1;i

sum[i]=A[i]-B[i]+c;

if(sum[i]

sum[i]+=Base;

c=-1;

}else c=0;

}

sum[0]=1;

for(int i=A[0];i>=1;--i){

if(sum[i]){

sum[0]=i;

break;

}

}

}

//******************************************************************************

void mult(int *A,int *B,int *sum){//大整数相乘

int i,j,k;

int all=A[0]+B[0]-1;

memset(sum,0,sizeof(int)*(all+3));

for(i=1,k=1;i

k=i;

if(A[i]){

for(j=1;j

sum[k]+=A[i]*B[j];

if(sum[k]>=Base){

sum[k+1]+=sum[k]/Base;

sum[k]=sum[k]%Base;

}

}

}

}

while(sum[k]>=Base){

sum[k+1]+=sum[k]/Base;

sum[k]=sum[k++]%Base;

}

if(!sum[k])k--;

sum[0]=k;

}

//******************************************************************************

//比较a,b的大小

bool cmp(int *a,int *b){

if(a[0]>b[0])return true;

if(a[0]

for(int i=a[0];i>=1;--i){

if(a[i]>b[i])return true;

if(a[i]

}

return true;

}

//比较a从第t个位置开始和b的大小

int cmp(int *a,int *b,int t){

int i,j=1;

for(i=b[0];i>=1;--i,++j){

if(a[t]>b[i])return j;

if(a[t]

--t;

}

return 0;

}

void copy(int *a,int *b){

a[0]=b[0];

for(int i=1;i

}

int zero[]={1,0};

//sum=a/b,r=a%b

void div(int *a,int *b,int *sum/*,int *r*/){//大整数除法

int m=a[0],n=b[0];

int Base1000=Base*1000,Base100=Base*100,Base10=Base*10;

if(!cmp(a,b)){

/*copy(r,a),*/copy(sum,zero);

return;

}

int k=m-n+1;

for(int i=k;i>=0;--i)sum[i]=0;

for(int i=k,t=m;i>=1,t>=n;){

int p=cmp(a,b,t);//a[t]-b[n]

if(p

if(p == 0){

sum[i]++;

for(int j=t;j>=t-n+1;--j)a[j]=0;

t-=n;

if(t

i-=n;

}

if(p>1){

sum[i]++;

for(int j=t,q=n;j>=t-n+1;--j,--q)a[j]-=b[q];

for(int j=t-n+1;j

if(a[j]

a[j]+=Base,a[j+1]--;

}

}

int j;

for(int j=t;j>=t-n+1;--j)if(a[j])break;

if(j

i-=(t-j);

t=j;

}

if(pn){

a[t-1]+=a[t]*Base;

a[t]=0;

--t;

--i;

}

if(p == 1){

int x=a[t]/(b[n]+1);

sum[i]+=x;

for(int j=t,q=n;q>=1;--q,--j)a[j]-=x*b[q];

for(int j=t-n+1;j

while(a[j]

while(a[j]

while(a[j]

while(a[j]

}

}

}

if(sum[k] == 0)sum[0]=k-1;else sum[0]=k;

/*int i;

for(i=m;i>=1;--i)if(a[i])break;

if(i == 0)copy(r,zero);

else{

r[0]=i;

while(i >= 1)r[i]=a[i--];

}*/

}


相关内容

  • 数与代数教材分析.重难点突破
    <整理与复习──数与代数>教材分析 本节内容是小学阶段"数与代数"知识的系统整理与复习.修订后的教材主要分四部分,分别是"数的认识""数的运算""式与方程&q ...
  • 六年级数学上册教学设计:整数乘法运算法则
    六年级数学上册教案:整数乘法运算法则教学目标:1.理解整数的运算定律对于分数乘法同样适应.2.能灵活掌握分数简便计算的方法.3.能正确计算. 单元知识结构图分数乘以整数(求几个几是多少)分数意义一个数乘以分数(求一个数的几分之几是多少)分数 ...
  • 信息学奥林匹克竞赛教程
    第一课初识Pascal语言 信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力.选手首先应针对竞赛中题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后要写出高级语言程序,上机调试通过.程序设计是信 ...
  • 六年级上册单元教材分析(分数乘法2)
    义务教育课程标准实验教材六年级上册 第二单元"分数乘法"教材分析 1.例1(分数乘整数的意义及计算方法). 编排思想: (1)从人的步距与袋鼠步距的比较这样一个实际问题引入. (2)用线段图帮助学生理解题意. (3)探究 ...
  • 分数乘整数说课稿(共10篇)
    篇一:六年级上册<分数乘法第一课时>说课稿 (鞠躬) 各位评委老师你们好. 我是1号选手,今天我说课的课题是(分数乘法 ), 我将从说教材.说教法学法.说教学 过程.说板书设计这四个阶段来完成我的说课. 一.说教材. ( 分数乘 ...
  • [程序设计基础]实验指导书
    实验1 C的实验环境和C语言的数据类型 ⒈ 实验目的 ⑴ 了解在具体的语言环境下如何编辑.编译.连接和运行一个C程序. ⑵ 通过运行简单的C程序,初步了解C源程序的特点. ⑶ 掌握C语言数据类型,熟悉如何定义一个整型.字符型和实型的变量,以 ...
  • 人教版五年级数学下册单元计划
    第一单元:观察物体(三) 教材分析 本单元的主要学习内容是在前面经历了从不同角度观察实物和单个立体图形以及几何组合体的学习基础上,进一步学习根据从一个或多个方向观察到的图形拼搭出相应的几何组合体.主要包括两个方面的内容: 1.根据给出的从一 ...
  • 有理数及其运算单元测试题
    第二章 有理数及其运算单元测试题 (120分钟 150分) 一.选择题(每题3分,共36分) 1.已知①1-22:②│1-2│:③(1-2)2:④1-(-2),其中相等的是( ). A .②和③ B .③和④ C .②和④ D .①和② 2 ...
  • 如何将汉字转换成二进制编码
    各数制之间的转换 我们用R表示任何数制的基数,讨论各数制之间的转换. 1.R进制数转换为十进制数 二进制.八进制和十六进制数转换为等值的十进制数,只要把它们用多项式表示并在十进制下进行计算,所得的结果就是十进制数. 2.十进制数转换为R进制 ...
  • 七年级上册知识点总结
    初一数学知识点总结 (初一上学期) 1.有理数: (1)正数和负数 负数:比0小的数 正数:比0大的数 ①字母a可以表示任意数,当a表示正数时,-a是负数:当a表示负数时,-a是正数:当a表示0时,-a仍是0.(如果出判断题为:带正号的数是 ...