来自祖安的简单计算器(高精度)

小白第一次写这么长的东西,好像有的地方还没有考虑负数的情况,哈哈哈
第一份小作品,纪念一下,嘻嘻 。

#include<iostream>
#include<string.h>
using namespace std;
int c[100005];//最后的结果数组;
void MaxAdd(string a,string b);//高精加 
void MaxSubtract(string a,string b);//高精减 
void MaxMultiplication(string a,string b);//高精乘 
void MaxtoLowDivision(string a,int b);//高精除低精度 
void MaxDivision(string a,string b);//高精度除法 
void Subduction(int a[],int b[]);//计算a=a-b
int Compare(string a,string b); //对比 
int DivisionCompare(int  a[],int  b[]);
int main(){
	string s1,s2;
	int t,k;
	cout<<"233333333,please select a item:"<<endl;
	cout<<"     $$$$$$$$$$$$$$$$$$$$$$$"<<endl;
	cout<<"1,高精度加法"<<endl ;
	cout<<"2.高精减"<<endl;
	cout<<"3.高精乘 "<<endl;
	cout<<"4.高精除低精度 "<<endl;
	cout<<"5.高精度除法."<<endl;
	cout<<"0. *********结束(内容被和谐了)"<<endl;
	cout<<"     $$$$$$$$$$$$$$$$$$$$$$$$"<<endl;
	while(cin>>k,k!=0)
	{
		switch(k)
		{	
			case 1:
					cout<<"Please enter Big number one   = ";
	                cin>>s1;
	                cout<<"Please enter Big number two   = ";
	                cin>>s2;
				MaxAdd(s1,s2);
					break;
	
			case 2:
					cout<<"Please enter Big number one   = ";
	                cin>>s1;
	                cout<<"Please enter Big number two   = ";
	                cin>>s2;
				MaxSubtract(s1,s2);
					break;
			case 3:
					cout<<"Please enter Big number one   = ";
	                cin>>s1;
	                cout<<"Please enter Big number two   = ";
	                cin>>s2;
				MaxMultiplication(s1,s2);
					break;
			case 4:
					cout<<"Please enter Big number one   = ";
	                cin>>s1;
	                cout<<"Please enter Small number   = ";
                    cin>>t;
				MaxtoLowDivision(s1,t);
					break;
			case 5:	
					cout<<"Please enter Big number one   = ";
	                cin>>s1;
	                cout<<"Please enter Big number two   = ";
	                cin>>s2;
				MaxDivision(s1,s2);
					break;			
		}
	  cout<<"AND WHICH ITEM YOU WANT TO DO ?   PLEASE CHOOSE A ITEM , IF YOU WANT TO EXIT , PLEASE ENTER A '0' ,THANK ! "<<endl;
	}            
	    if(k==0)
			cout<<"***********************************(内容被和谐了)!" <<endl;
		return 0;
}


int compare(string a,string b){
	if(a.length()>b.length()) return 0;//位数大返回零 
	if(a.length()<b.length()) return 1;//位数小返回一 
	if(a.length()==b.length()){//相等情况逐个比较 
		for(int i=0;i<=a.length();i++){
			if(a[i]>b[i]) return 0; //大的返回零 
			if(a[i]<b[i]) return 1;//小的返回一 
		}
	}
	return 0;//全部相等返回零 
}


int DivisionCompare(int  a[],int  b[]){
	if(a[0]>b[0]) return 1;//大于就返回1 
	if(a[0]<b[0]) return -1;
	if(a[0]==b[0]){
		for(int i=a[0];i>=1;i--){
			if(a[i]>b[i]) return 1;//大于就返回1 
			if(a[i]<b[i]) return -1;//小于就返回0 
		}
	}
	return 0;//相等就返回0 
}


void Subduction(int a[],int b[])//计算a=a-b
{
    int flag;
 
    flag=DivisionCompare(a,b);// 大于小于 小于就不用做了 
    if(flag==0)//相等
    {
        a[0]=0;//直接整除了 
        return;//直接终止 上面答案已经加过一次了 
    }
    if(flag==1)//大于
    {
        for(int i=1;i<=a[0];i++)//相当于做减法 
        {
            if(a[i]<b[i])//若不够向上借位
            {
                a[i+1]--;
                a[i]+=10;
            }
            a[i]-=b[i];
        }
        while(a[0]>0&&a[a[0]]==0)//删除前导0
            a[0]--;//说明被除数少了一位 把0去掉 
        return;//终止 
    }
}



void MaxAdd(string a,string b){
	int cc[100005],kk[100005];//存储整形数组 
	int len;//长度 
	
	memset(cc,0,sizeof(cc));//清空 
	memset(kk,0,sizeof(kk));//清空 
	memset(c,0,sizeof(c));//清空 
	
	cc[0]=a.length();//读取位数(长度) 
	kk[0]=b.length();//读取位数(长度) 
	
	for(int i=1;i<=cc[0];i++)//逐个存入 转为整形 
	   cc[i]=a[cc[0]-i]-'0';
	for(int i=1;i<=kk[0];i++)//逐个存入 转为整形 
	   kk[i]=b[kk[0]-i]-'0';
	   
    len=(cc[0]>=kk[0]?cc[0]:kk[0]);//读取最大位数 
    
	for(int i=1;i<=len;i++){//逐位计算 
		c[i]+=(cc[i]+kk[i]);//加 
		c[i+1]+=c[i]/10;//进位 
		c[i]%=10;//取余 
	}
	
	len++;//去零 
	while(c[len]==0&&len>1) len--;//去零 
	
	cout<<"The answer of addition = ";
	
	for(int i=len;i>=1;i--)//逐位输出 
	   cout<<c[i];
	   
	cout<<endl;
}



void MaxSubtract(string a,string b){
	int cc[100005],kk[100005];//存储整形数组 
	int len;
	
	memset(cc,0,sizeof(cc));//清空 
	memset(kk,0,sizeof(kk));//清空 
    memset(c,0,sizeof(c));//清空 
	
	cc[0]=a.length();//读取位数(长度) 
	kk[0]=b.length();//读取位数(长度) 
	
	for(int i=1;i<=cc[0];i++)//逐个存入 转为整形 
	   cc[i]=a[cc[0]-i]-'0';
	for(int i=1;i<=kk[0];i++)//逐个存入 转为整形 
	   kk[i]=b[kk[0]-i]-'0';
	   
	if(compare(a,b)==0){//此为a大于等于b的情况 
	   	for(int i=1;i<=cc[0];i++){//逐个相减 
	   		c[i]+=(cc[i]-kk[i]);
	   		
	   		if(c[i]<0){//补位 
	   			c[i+1]--;
	   			c[i]+=10;
	   			
			   }
		   }
		len=cc[0];    //取位数(长度) 
	}
	
	else{//此为b大于a的情况 
		
		for(int i=1;i<=kk[0];i++){//逐个相减 
			c[i]+=(kk[i]-cc[i]); 
			
			if(c[i]<0){//补位 
				c[i+1]--;
				c[i]+=10;
				
			}
		}
		len=kk[0];//取长度 
	}
	
	len++;//去零 操作 
	while(c[len]==0&&len>1) len--;// 去零 
	
	cout<<"The answer of subtraction = ";
	
    if(compare(a,b)!=0) cout<<"-";//先输出一个负号 
    
	for(int i=len;i>=1;i--)//逐个输出 
	    cout<<c[i];
	    
	cout<<endl;
} 


void MaxMultiplication(string a,string b){
	int cc[100005],kk[100005];//存储整形数组 
	int len;//长度 
	
	memset(cc,0,sizeof(cc));//清空 
	memset(kk,0,sizeof(kk));//清空 
	memset(c,0,sizeof(c));//清空 
	
	cc[0]=a.length();//读取位数(长度) 
	kk[0]=b.length();//读取位数(长度) 
	
	for(int i=1;i<=cc[0];i++)//逐个存入 转为整形 
	   cc[i]=a[cc[0]-i]-'0';
	for(int i=1;i<=kk[0];i++)//逐个存入 转为整形 
	   kk[i]=b[kk[0]-i]-'0';
	   
	for(int i=1;i<=cc[0];i++){	//乘法  
		for(int j=1;j<=kk[0];j++){
		 c[i+j-1]+=cc[i]*kk[j];
		 c[i+j]+=c[i+j-1]/10;//进位 
		 c[i+j-1]%=10; //取余 
	    }   
    }
	
	len=cc[0]+kk[0]+1;//去零 
	while(c[len]==0&&len>1) len--;//去零 
	
	cout<<"The answer of multiplication = ";
	
	for(int i=len;i>=1;i--)
	    cout<<c[i];
	    
	cout<<endl; 
} 


void MaxtoLowDivision(string a,int b){
	int cc[100005],len,k=0;//存储数组 
	
	memset(cc,0,sizeof(cc));
	memset(c,0,sizeof(c));
	
	cc[0]=a.length();//取最大位 
	
	for(int i=1;i<=cc[0];i++)
	   cc[i]=a[i-1]-'0';//存储 
	
	for(int i=1;i<=cc[0];i++){
		c[i]=(k*10+cc[i])/b;//做除法,k是余数 模拟除法算法 相当于手算过程                               
		   k=(k*10+cc[i])%b;//余数 
	}
	                                                         //例子 123456789 存入为 123456789 (从1到9) cc[0]=9  假设除10  则为 012345678 余 9   此时输出会输出0 
	len=1;//去零操作                                            len=1 c[len]==0 len++后可以输出为12345678  去掉首位的0 
	while(c[len]==0&&len<cc[0]) len++;//去零 
	
	cout<<"The answer of MaxtoLowDivision is = ";
	
	for(int i=len;i<=cc[0];i++)
	   cout<<c[i];            //逐个输出 
	   
	if(k!=0) cout<<"      The Remainder is ="<<k;   //输出余数 
	
	cout<<endl;
} 


void MaxDivision(string a,string b){
	/*这个比较难以理解 举个例子 3500 和 499
	那么在我们转换数组之后 变成了 0053和994  
	一个四位数除于一个三位数 最大的情况 答案只有两位 例子: 9999除于100等于99
	因此 我们定义c[0]为其最大位数  就是两者相减加一(防止两者位数相同的情况 比如 6处于2等于3) 
	由于除数是不能变的  因此我们把除数存入一个临时数组temp里面
	然后在被除数能被除的那一位进行除法  
	然后让被除数与temp数组做减法  答案做加法 并且去掉被除数前面的零 同时计算被除数的位数 
	就是一个模拟除法计算的过程 我们只会加法和减法 ,现在要让计算机模拟这个计算的过程并且存入数组 不输出零就可以了 
	*/ 
	 
	int kk[100005],cc[100005],temp[100005];
	
	memset(kk,0,sizeof(kk));
	memset(cc,0,sizeof(cc));                                                                
	memset(c,0,sizeof(c));
	
	cc[0]=a.length();//读取位数(长度) 
	kk[0]=b.length();//读取位数(长度) 
	
	for(int i=1;i<=cc[0];i++)//逐个存入 转为整形 
	   cc[i]=a[cc[0]-i]-'0';
	for(int i=1;i<=kk[0];i++)//逐个存入 转为整形 
	   kk[i]=b[kk[0]-i]-'0';
	   
	c[0]=cc[0]-kk[0]+1;
	                                                                    //cout<<c[0]<<endl;//例子300 100 c[0]=1 没问题 
	for(int i=c[0];i>0;i--){                                             
		memset(temp,0,sizeof(temp));//清空temp这个划水数组                            
		for(int j=1;j<=kk[0];j++)                                                  
			temp[i+j-1]=kk[j];//把kk数组存入temp里面                                 
	                                                                  //for(int j=1;j<=kk[0];j++)                                                  
		                                                                //     	cout<<temp[j]<<endl;   //temp为 001 没问题 
		temp[0]=i+kk[0]-1;//temp的最大位数 后面要用                                  
		
		while(DivisionCompare(cc,temp)>=0){
			c[i]++;     //compare能过说明可以除 答案加一
			Subduction(cc,temp);//答案每加一就把  kk数组  减一次     
		} 
	}
	while(c[0]>0&&c[c[0]]==0) c[0]--;//去零
	
	cout<<"The answer of MaxDivision is = ";
	
	if(c[0]==0)  cout<<0;   //说明被除数小了 
	else{
		for(int i=c[0];i>0;i--)
		   cout<<c[i];//逐位输出答案  
	}
	                                                                    // cout<<cc[0]<<endl; 没问题 
	if(cc[0]!=0){//看看有没有余数 
		cout<<"   The Remainder  is = ";
			for(int i=cc[0];i>0;i--)
		   cout<<cc[i];//逐位输出余数 
	}
	
	cout<<endl;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值