一、高精度加法
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str1,str2;
int a[250],b[250],len; //数组的大小决定了计算的高精度最大位数
int i;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin>>str1>>str2; //输入两个字符串
a[0]=str1.length(); //取得第一个字符串的长度
for(i=1;i<=a[0];i++) //把第一个字符串转换为整数,存放在数组a中
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length(); //取得第二个字符串长度
for(i=1;i<=b[0];i++) //把第二个字符串中的每一位转换为整数,存放在数组B中
b[i]=str2[b[0]-i]-'0';
len=(a[0]>b[0]?a[0]:b[0]); //取两个字符串最大的长度
for(i=1;i<=len;i++) //做按位加法,同时处理进位
{
a[i]+=b[i];
a[i+1]+=a[i]/10;
a[i]%=10;
}
len++; //下面是去掉最高位的0,然后输出。
while((a[len]==0)&&(len>1)) len--;
for(i=len;i>=1;i--)
cout<<a[i];
return 0;
}
//注意:两个数相加,结果的位数,应该比两个数中大的那个数多一位。
二、高精度减法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[200000],b[200000];
//自定义函数,比较两个字符串数字大小,大于等于返回true,小于返回false
bool compare(string str1,string str2)
{
//先比较长度
if(str1.length()>str2.length()) //字符串长的对应的数就大
return true;
else if(str1.length()<str2.length()) //字符串短的对应的数就小
return false;
else //字符串长度相等时一位一位的比
{
for(int i=1;i<=str1.length();i++)
{
if(str1[i]>str2[i])
return true;
else if(str1[i]<str2[i])
return false;
}
}
return true; //长度相等且每一位的数也相等,返回false
}
int main()
{
string s1,s2;
memset(a,0,sizeof(a)); //数组初始化
memset(b,0,sizeof(b));
cin>>s1>>s2; //输入字符串
a[0]=s1.length(); //第一个字符串的长度存入a[0]
for(int i=1;i<=a[0];i++)//把第一个字符串转换为整数,存放在数组a
a[i]=s1[a[0]-i]-'0';
b[0]=s2.length(); //第二个字符串的长度存入b[0]
for(int i=1;i<=b[0];i++)//把第二个字符串中转换为整数,存放在数组b
b[i]=s2[b[0]-i]-'0';
if(compare(s1,s2)) //第一个字符串大于等于第二个,做按位减,并处理借位
{
for(int i=1;i<=a[0];i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i+1]--;
a[i]+=10;
}
}
a[0]++;
while((a[a[0]]==0)&&(a[0]>1)) //清除前导零
a[0]--;
for(int i=a[0];i>=1;i--) //前面反向存入数组,现在反向输出
printf("%d",a[i]);
printf("\n");
}
else
{
printf("-"); //小于则先输出负号
for(int i=1;i<=b[0];i++)
{
b[i]-=a[i];
if(b[i]<0)
{
b[i+1]--;
b[i]+=10;
}
}
b[0]++;
while((b[b[0]]==0)&&(b[0]>1)) //清除前导零
b[0]--;
for(int i=b[0];i>=1;i--) //反向输出
printf("%d",b[i]);
printf("\n");
}
return 0;
}
三、高精度乘法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
string str1,str2;
int a[20000],b[20000],c[40000]; //数组c用来存放两数的乘积
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>str1>>str2;
a[0]=str1.length();
for(int i=1;i<=a[0];i++)
a[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for(int i=1;i<=b[0];i++)
b[i]=str2[b[0]-i]-'0';
//根据乘法运算规则,这里需用双重循环,每一位进行相乘
for(int i=1;i<=a[0];i++) //做按位乘法同时处理进位
{
for(int j=1;j<=b[0];j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10; //进位
c[i+j-1]%=10;
}
}
int len=a[0]+b[0]+1;
while((c[len]==0)&&(len>1)) //清除前导零
len--;
for(int i=len;i>=1;i--)
printf("%d",c[i]);
return 0;
}
四、高精度除法:
第一种情况:高精除以低精,实际上就是对被除的每一位,包括前面的余数都除以除数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
char a1[100],c1[100];
int a[100],c[100],lena,i,x=0,lenc,b;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
gets(a1); //输入高精度被除数
cin>>b; //输入低精度除数
lena=strlen(a1);
for (i=0;i<=lena-1;i++)
a[i+1]=a1[i]-48; //将高精度被除数放入a数组
for (i=1;i<=lena;i++) //按位相除
{
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lenc=1;
while (c[lenc]==0&&lenc<lena)
lenc++; //删除前导0
for (i=lenc;i<=lena;i++)
cout<<c[i];
cout<<endl;
return 0;
}
第二种情况:高精除以高精
#include <bits/stdc++.h>
using namespace std;
int a[100],b[100],c[100];
int compare(int a[],int b[])//比较a、b,若a>b为1;若a<b为-1;若a=b为0
{
int i;
if(a[0]>b[0])
return 1;
if(a[0]<b[0])
return -1;
for(i=a[0];i>0;i--)//从高位到低位比较
{
if(a[i]>b[i])
return 1;
if(a[i]<b[i])
return -1;
}
return 0;
}
void subduction(int a[],int b[])//计算a=a-b
{
int flag;
int i;
flag=compare(a,b);
if(flag==0)//相等
{
a[0]=0;
return;
}
if(flag==1)//大于
{
for(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]--;
return;
}
}
int main()
{
char str1[100],str2[100];
int i,j;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>str1>>str2;
a[0]=strlen(str1);//a[0]存储串1的位数
b[0]=strlen(str2);//b[0]存储串2的位数
for(i=1;i<=a[0];i++)
a[i]=str1[a[0]-i]-'0';
for(i=1;i<=b[0];i++)
b[i]=str2[b[0]-i]-'0';
int temp[100];
c[0]=a[0]-b[0]+1;
for(i=c[0];i>0;i--)
{
memset(temp,0,sizeof(temp));
for(j=1;j<=b[0];j++)//从i开始的地方,复制数组b到数组temp
temp[j+i-1]=b[j];
temp[0]=b[0]+i-1;
while(compare(a,temp)>=0)//用减法模拟
{
c[i]++;
subduction(a,temp);
}
}
while(c[0]>0&&c[c[0]]==0)//删除前导0
c[0]--;
cout<<"商为:";
if(c[0]==0)//输出结果
cout<<0<<endl;
else
{
for(i=c[0];i>0;i--)
cout<<c[i];
cout<<endl;
}
cout<<"余数为:";
if(a[0]==0)//输出余数
cout<<0<<endl;
else
{
for(i=a[0];i>0;i--)
cout<<a[i];
cout<<endl;
}
return 0;
}