#include <iostream>
#include <cstring>
using namespace std;
#define MAX 1000
//---------------------------------工具函数-------------------------------//
void zhihuan(char *a, int l)
{
int i,len;
len=l/2;
char temp;
for (i=0;i<len;i++)
{
temp=a[i];
a[i]=a[l-1-i];
a[l-1-i]=temp;
}
}
void cleanzero(char *a)
{//高位清零
int lena=strlen(a);
int j=0;
bool flag = false;
for(j = 0; j < lena;j++)
{
if (a[j] == '0')
{
a[j]=0;
flag =true;
}
else break;
}
if (flag)
{
for (int i= 0;i< lena-j;i++)
{
a[i]=a[i+j];
}
a[lena-j]=0;
}
}
void change(char *a,char *b)
{
int len_a=strlen(a);
int len_b=strlen(b);
char temp[MAX];
strcpy(temp,a);
strcpy(a,b);
strcpy(b,temp);
int lab;
lab=len_a;
len_a=len_b;
len_b=lab;
}
void leftshift(char*a, int n) //字符穿 左移 n
{
int len= strlen(a);
for (int i =0;i < n;i++)
{
a[i+len]='0';
}
a[i+len]=0;
}
int compare(char*a,char*b)
{//a<b return 1 a>b return -1 a=b return 0
cleanzero(a);
cleanzero(b);
int lena=strlen(a);
int lenb=strlen(b);
lena=strlen(a);
lenb=strlen(b);
if (lena<lenb)
{
return 1;
}
else if (lena>lenb)
{
return -1;
}
else
{//lena = lenb
for (int i = 0;i < lena;i++)
{
if (a[i] < b[i])
{
return 1;
}
else if (a[i] > b[i])
{
return -1;
}
}
return 0;
}
}
//-----------------------------------ADD----------------------------------//
void Add(char *a,char *b)
{
int i,j,len=0,flag=0;//len 和 的长度,flag进位;
int la,lb;
char temp[MAX]={0};
la=strlen(a);
lb=strlen(b);
for (i=la-1,j=lb-1;i>=0&&j>=0;i--,j--)
{
temp[len++]=(a[i]-'0'+b[j]-'0'+flag)%10+48;
if (a[i]-48+b[j]-48+flag>9)
{
flag=1;
}
else
{
flag=0;
}
}
while (i>=0)
{
temp[len++]=(a[i]+flag-48)%10+48;
if(a[i]+flag-48>9)
{
flag=1;
}
else
{
flag=0;
}
i--;
}
while (j>=0)
{
temp[len++]=(b[j]+flag-48)%10+48;
if(b[j]+flag-48>9)
{
flag=1;
}
else
{
flag=0;
}
j--;
}
if(flag==1)
{
temp[len++]='1';
}
zhihuan(temp,len);
strcpy(a,temp);
return ;
}
//--------------------------------SUB---------------------------------------//
void Sub(char *a,char *b)
{
if (compare(a,b) == 1)
{
a[0]='0';
a[1]=0;
return ;
}
int len,i,j,c=0;//c jin wei
int flag;
int la,lb;
cleanzero(a);
cleanzero(b);
la=strlen(a);
lb=strlen(b);
char temp[MAX]={0};
flag=compare(a,b);
len=0;
for(i=la-1,j=lb-1;j>=0;i--,j--)
{
if(a[i]+c<b[j])
{
temp[len++]=(a[i]-48)+c+10-(b[j]-48)+48; c=-1;
}
else
{
temp[len++]=(a[i]-48)+c-(b[j]-48)+48;
c=0;
}
}
while(i>=0)
{
if(a[i]+c<'0')
{
temp[len++]=a[i]+c+10;
c=-1;
}
else
{
temp[len++]=a[i]+c;
c=0;
}
i--;
}
temp[len]='\0';
zhihuan(temp,len);
strcpy(a,temp);
}
//--------------------------------MUL---------------------------------------//
void Mul(char *a,char *b)
{
int i,j,da=0,db=0,ltp_a=0,ltp_b=0;
int la=strlen(a);
int lb=strlen(b);
int c,tc; //jin wei
char tp_a[MAX],tp_b[MAX];
int itp_b=0,itp_a=0;
for(i=la-1;i>=0;i--)
{
itp_b=0;
tc=c=0;
for(j=lb-1;j>=0;j--)
{
tc=c;
c=(c+(a[i]-'0')*(b[j]-'0'))/10;
tp_b[itp_b++]=(tc+(a[i]-'0')*(b[j]-'0'))%10+'0';
}
if(c>0)
tp_b[itp_b++]=c+'0';
if(i!=la-1)//第一次循环不移位
{
if(itp_a-(la-i-1)>itp_b)
{
for(j=itp_b;j<itp_a-(la-i-1);j++)
tp_b[j]='0';
itp_b=itp_a-(la-i-1);
}
else
{
for(j=itp_a;j<itp_b+(la-i-1);j++)
tp_a[j]='0';
itp_a=itp_b+(la-i-1);
}
c=0;
for(j=0;j<itp_b;j++)
{
tc=c;
c=(tc+tp_b[j]-'0'+tp_a[j+la-i-1]-'0')/10;
tp_a[j+la-i-1]=(tc+tp_b[j]-'0'+tp_a[j+la-i-1]-'0')%10+'0';
}
if(c>0)
tp_a[itp_a++]=c%10+'0';
}
else
{
for(j=0;j<itp_b;j++)
tp_a[j]=tp_b[j];
itp_a=itp_b;
}
}
while(tp_a[itp_a-1]=='0'&&itp_a>1)
{
tp_a[itp_a-1]='\0';
itp_a--;
}
zhihuan(tp_a,itp_a);
tp_a[itp_a]='\0';
strcpy(a,tp_a);
}
//除法
void Div()
{
char b[MAX],a[MAX];//输入的大整数
//int la,lb;//数组长度
int num,div,len;
cout<<"请输入两个数(只能为正数):\n";
cout<<"被除数: ";
cin>>b;
cout<<"除数:";
cin>>a;
char x[MAX],y[MAX],z[MAX];//输入的大整数
x[0]='0';
x[1]=0;
strcpy(y,b); //把b复值给y
cleanzero(y);
cleanzero(a);
char tmp[]="1";
while (compare(y,a) != 1)
{
div = y[0]-'0';
num = a[0]-'0';
len = strlen(y)-strlen(a);
if((div==num)&&(len==0))
{
Add(x,tmp);
Sub(y,a);
cleanzero(y);
break;
}
if((div<=num)&&len)
{
len--;
div=(div*10)+y[1]-'0';
}
div = div/(num + 1);
z[0] = div+'0';
z[1]=0;
if (len)
{
leftshift(z,len);
}
Add(x,z);
char sss[MAX];
strcpy(sss,a);
Mul(sss,z);
Sub(y,sss);
cleanzero(y);
}
cout<<"商为:"<<x<<endl;
cout<<"余数:"<<y<<endl;
}
void main()
{
cout<<compare("10","11")<<endl;
int flag=1;
int chioce=0;
char a[MAX]={0},b[MAX]={0};
while(flag==1)
{
cout<<"========================================================="<<endl;
cout<<" ||**============欢迎使用大整数运算计算器============**||"<<endl;
cout<<"========================================================="<<endl;
cout<<" || 1.加法运算 o(∩_∩)o 2.减法运算 ||"<<endl;
cout<<" || 3.乘法运算 o(∩_∩)o 4.除法运算 ||"<<endl;
cout<<" || (*^__^*) 温馨提示:退出请按“0” (*^__^*) ||"<<endl;
cout<<"========================================================="<<endl;
cout<<"请选择:";
cin>>chioce;
switch(chioce)
{
case 1:
cout<<"请输入两个数(只能为正数):\n";
cout<<"加数1:";
cin>>a;
cout<<"加数2:";
cin>>b;
Add(a,b);
cout<<"两数之和为:"<<endl;
cout<<a<<endl;
break;
case 2:
cout<<"请输入两个数(只能为正数):\n";
cout<<"被减数:";
cin>>a;
cout<<" 减数:";
cin>>b;
Sub(a,b);
cout<<"两数之差为:"<<endl;
cout<<a<<endl;
break;
case 3:
cout<<"请输入两个数(只能为正数):\n";
cout<<"乘数1:";
cin>>a;
cout<<"乘数2:";
cin>>b;
Mul(a,b);
cout<<"两数之积为:"<<endl;
cout<<a<<endl;
break;
case 4:
Div();
break;
case 0:
flag=0;
cout<<"--------------谢谢使用!--------------- "<<endl;
break;
default:
cout<<"选择错误!请重新选择!"<<endl;
}
}
}