数据结构大整数计算器链表

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std; 


typedef struct nnode{
   char data[1000];
   int lenth;

}SqString;

void StrAssign(SqString *a,char *str)//将字符串赋值到串里。
{
   int i,j;
   j=strlen(str);
   for(i=0;i<j;i++)
   {
    	a->data[i]=0;
        a->data[i]=str[i];
   }
   a->data[i]='\0';
   a->lenth=j;
}

int Compare(SqString *a1,SqString *b1)//比较两数的大小。
{
    if(a1->lenth>b1->lenth)
	{ 
		return 1;
	}
    else if(a1->lenth==b1->lenth) 
	{
       int i=0;
       while(a1->data[i]==b1->data[i]&&i<a1->lenth)
            i++;
		if(i==a1->lenth) 
	   		return 0;
        else if(a1->data[i]>b1->data[i]) 
	   		return 1;
       	else 
			return -1;
    }
    else 
		return -1;

}

void add(SqString *a1,SqString *b1,SqString *c1)
{
    char pp[100];
    int a[100];//加数
    int b[100];//被加数
    int c[100]={0};//和
    int i,j=0,k;//i用来循环,j表示进位 ,两加数中较小加数的长度放到k里
    int l1,l2,d;
    l1=a1->lenth;
    l2=b1->lenth;
    k=l1>l2?l2:l1;
    for(i=0;i<a1->lenth;i++)//字符串逆序导入数组中
        a[i]=a1->data[l1-1-i]-'0';
    for(i=0;i<b1->lenth;i++)
        b[i]=b1->data[l2-1-i]-'0';
    for(i=0;i<k;i++)
	{
       d=a[i]+b[i]+j;
       j=d/10;
       c[i]=d%10;
    }
    while(i<l1)
	{
        d=a[i]+j;
        j=d/10;
        c[i]=d%10;
        i++;
    }
	while(i<l2)
	{
        d=b[i]+j;
        j=d/10;
        c[i]=d%10;
        i++;
    }
	if(j>0)
	{
		c[i]=j;
		i++;
	}
	for(j=0,k=i-1;k>-1;k--,j++)
		pp[j]=c[k]+'0';
	pp[j]='\0';
   StrAssign(c1,pp);
}

void subtract(SqString *a1,SqString *b1,SqString *c1)
{
    int a[100];//把较大的数放于减数
    int b[100];//把较小的数放于被减数
    int c[100]={0};//差
    int i,j,k;//i用来循环 ,两加数中较大加数的长度放到j里,两加数中较小加数的长度放到k里
    int flag;//标志结果为正还是负。
    int l1,l2;
    char pp[100];
    l1=a1->lenth;
    l2=b1->lenth;
    k=l1>l2?l2:l1;
    j=l1<l2?l2:l1;
    if(strcmp(a1->data,b1->data)==0)
        StrAssign(c1,"0");
    else
	{
        if(Compare(a1,b1)>=0)//减数必须大于被减数。方便计算。如果小于,就调换位置。
		{
            flag=0;
            for(i=0;i<l1;i++)//字符串逆序导入数组中
               a[i]=a1->data[l1-1-i]-'0';
            for(i=0;i<l2;i++)
               b[i]=b1->data[l2-1-i]-'0';
        }
        else
		{
            flag=1;
            for(i=0;i<l2;i++)
            	a[i]=b1->data[l2-1-i]-'0';
            for(i=0;i<l1;i++)
                b[i]=a1->data[l1-1-i]-'0';
        }
        for(i=0;i<k;i++)
		{
            if(a[i]>=b[i]) 
				c[i]=a[i]-b[i];
            else
			{
				c[i]=a[i]+10-b[i];
        		--a[i+1];
            }

         }
    while(i<j)
	{
        if(a[i]>=0) 
			c[i]=a[i];
        else
		{
            c[i]=a[i]+10;
            --a[i+1];
        }
        i++;
    }
    while(c[i-1]==0) 
		i--;
    j=0;
    if(flag==1)
        pp[j++]='-';
    for(k=i-1;k>-1;k--,j++)
        pp[j]=c[k]+'0';
    pp[j]='\0';
    StrAssign(c1,pp);
    }

}

void multiply(SqString *a1,SqString *b1,SqString *c1)
{

    int a[100];
    int b[100];
    int c[100]={0};
    int d,i,j,k;//i,j用来循环
    int flag=0;//进位
    int l1,l2;
    l1=a1->lenth;
    l2=b1->lenth;
    StrAssign(c1,"0");
    for(i=0;i<a1->lenth;i++)
        a[i]=a1->data[l1-1-i]-'0';
    for(i=0;i<b1->lenth;i++)
         b[i]=b1->data[l2-1-i]-'0';
    for(i=0;i<l2;i++)
	{
        flag=0;
        for(j=0;j<l1;j++)
		{
            d=a[j]*b[i]+flag;
            c[j]=d%10;
            flag=d/10;
        }
        if(flag>0)
		{
            c[j]=flag;
            j++;
        }
        while(c[j-1]==0)
			j--;
    	char str[100];
        for(k=0;k<j;k++)
            str[k]=c[j-1-k]+'0';
        for(j=0;j<i;j++)
			str[k++]='0';
        str[k]='\0';
        SqString *ff;
        ff=(nnode *)malloc(sizeof(nnode));
        StrAssign(ff,str);
        add(c1,ff,c1);
    }

}
void one(char *a)
{
	int i,l=strlen(a);
	int carry=1; 
	char t;
	for(i=0;i<l;i++)
	{
		t=a[i]+carry;
		if(t>9+'0')
		{
			t='0';
			carry=1;
		}
		else
			carry=0;
		a[i]=t;
	}
	if(carry==1)
		a[i++]='1';
   a[i]='\0';
}
void divide(SqString *a1,SqString *b1,SqString *c1,SqString *d1)//C为商,D为余数
{
  // int i,j,k,
	char t[100]={0};
	char b[2]="0";
	if(Compare(a1,b1)==0)
	{
	    StrAssign(d1,"0");
	    StrAssign(c1,"1");
	}
	else if(Compare(a1,b1)<0)
	{
	    StrAssign(d1,a1->data );
	    StrAssign(c1,"0");
	}
	else
	{
		SqString *aa;
		aa=(nnode *)malloc(sizeof(nnode));
		StrAssign(aa,a1->data);
	while(Compare(aa,b1)>=0)
	{
	    subtract(aa,b1,c1);
	    StrAssign(aa,c1->data);
	    one(t);
	} 
	StrAssign(c1,t);
	StrAssign(d1,aa->data);
	}
}
void jsq()
{
   int flag=1;
   while(flag)
   {
		cout << "\n--------------------------------大整数计算器----------------------------------\n";
		cout << "\n *************** 0,退出       1,输入两个操作数       2,两数相加 ************* \n";
		cout << "\n *************** 3,两数相减   4,两数相乘            5,两数相除*************\n";
		cout << "\n 提示:按相应数字进行相应操作,请先输入操作数再进行运算 \n";
		cout << "\n----------------------------------------------------------------------------\n";
		cin >> flag;
		SqString  *a,*b,*c;
		a=(nnode *)malloc(sizeof(nnode));
		b=(nnode *)malloc(sizeof(nnode));
		c=(nnode *)malloc(sizeof(nnode));
		if(flag==1)
		{
			cout << "\n 请输入操作数:";
			char a1[100],b1[100];
			cin >> a1;
			cin >> b1;
			StrAssign(a,a1);
			StrAssign(b,b1);
			int co;
			cout << "请输入运算操作:";
			cin >> co;
			while(co)
			{
				if(co==1)
				{
			    	cout << "\n 请重新输入操作数 !!\n";
			        break;
			    }
			   	else if(co==2)
			   	{
			       add(a,b,c);
			       cout << "两者之和为:"<< c->data << endl;
			   	}
				else if(co==3)
			   	{
			     	subtract(a,b,c);
			    	cout << "两者之差为:" << c->data << endl;
				}
			    else if(co==4)
				{ 
			        multiply(a,b,c);
			        cout << "两者之积为:" << c->data << endl;
			    }
			    else if(co==5)
				{
			        SqString  *d;
			        d=(nnode *)malloc(sizeof(nnode));
			        if(strcmp(b->data,"0")==0)
			        { 
						cout << "除数不能为0";
						break;
					}
			        else
					{
			        	divide(a,b,c,d);
			          	cout << "商为:  " ;
			         	int i=strlen(c->data)-1;
			         	for(;i>=0;i--)
			               cout << c->data[i] << endl;
			        	cout << " 余数为:" << d->data << endl;
			        } 
			    }
			    else 
				{
			        cout << "\n 输入错误,请重新输入!!!\n" << endl;
			    }
			cout << "\n 请输入运算操作:" ;
			cin >> co;
			}
		}
		else if(flag==0)
			cout << "退出该计算器。" << endl;
		else
			cout << "输入错误,请重新输入!!!" << endl;
	}
}
int main()
{
	
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、设计目的 本课程设计旨在通过实现一个大整数计算器,帮助学生深入理解数据结构的相关知识,掌握大整数的存储、运算等基本操作,提高编程能力。 二、设计内容 1.需求分析 大整数计算器需要支持以下功能: (1)大整数的输入输出 (2)大整数的加、减、乘、除运算 (3)大整数的比较大小 (4)大整数的求绝对值 (5)大整数的取模运算 2.数据结构设计 (1)大整数的存储 由于大整数可能会超出计算机所能表示的范围,因此需要使用链表来存储大整数。每个节点存储一个位数,节点之间通过指针连接。 (2)大整数的加、减、乘、除运算 加法:从低位到高位分别相加,若有进位则向高位一位加1。 减法:从低位到高位分别相减,若有借位则向高位一位减1。 乘法:将一个大数分解成若干个数字,每个数字与另一个大数相乘,然后将结果相加。 除法:将被除数和除数转换为整数,然后进行长除法运算。 (3)大整数的比较大小 从高位到低位比较每一位,若某一位不同则可以确定大小关系。 (4)大整数的求绝对值 将负数取反。 (5)大整数的取模运算 将被除数除以除数,求出余数。 3.算法设计 (1)大整数的加法 1.从低位到高位分别相加,若有进位则向高位一位加1; 2.若两数位数不等,则将短数的高位补0,使两数位数相同; 3.若最高位有进位,则需增加一位,将进位加在最高位。 (2)大整数的减法 1.从低位到高位分别相减,若有借位则向高位一位减1; 2.若被减数小于减数,则需向高位借位; 3.若减数的最高位为0,则需去除前导0。 (3)大整数的乘法 1.将一个大数分解成若干个数字,每个数字与另一个大数相乘,然后将结果相加; 2.从低位到高位依次计算,每次计算结果存储在一个临时变量中; 3.每次计算结束后,将结果加到最终结果中。 (4)大整数的除法 1.将被除数和除数转换为整数,然后进行长除法运算; 2.从高位到低位依次计算,将计算结果存储在一个临时变量中; 3.每次计算结束后,将结果加到最终结果中。 三、实现方法 1.使用C++语言实现。 2.使用链表存储大整数,每个节点存储一个位数,节点之间通过指针连接。 3.实现大整数的加、减、乘、除运算,比较大小和求绝对值等基本操作。 4.使用测试用例验证程序的正确性和鲁棒性。 四、总结 通过本课程设计,我深入理解了数据结构的相关知识,掌握了大整数的存储、运算等基本操作,提高了编程能力。同时,也感受到了编写高效、鲁棒的程序的重要性,这对我今后的学习和工作都有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值