#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()
{
}
数据结构大整数计算器链表
最新推荐文章于 2022-05-19 22:22:19 发布