小白第一次写这么长的东西,好像有的地方还没有考虑负数的情况,哈哈哈
第一份小作品,纪念一下,嘻嘻 。
#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;
}