六、高精度加法
#include
#include
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
using namespace std;
int compare(string s1,string s2);
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[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for(i=1;i<=b[0];i++)
b[i]=str2[b[0]-i]-'0';
if((compare(str1,str2))==0) //大于等于,做按位减,并处理借位。
{
for(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(i=a[0];i>=1;i--)
cout<<a[i];
cout<<endl;
}
else
{
cout<<'-'; //小于就输出负号
for(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(i=b[0];i>=1;i--)
cout<<b[i];
cout<<endl;
}
return 0;
}
int compare(string s1,string s2) //比较字符串(两个数)数字的大小,大于等于返回0,小于返回1。
{
if(s1.length()>s2.length()) return 0; //先比较长度,哪个字符串长,对应的那个数就大
if(s1.length()
for(int i=0;i<=s1.length();i++) //长度相同时,就一位一位比较。
{
if(s1[i]>s2[i]) return 0;
if(s1[i]
}
return 0; //如果长度相同,每一位也一样,就返回0,说明相等
}
做减法时,首先要判断两个字符串的大小,决定是否输出负号,然后就是按位减法,注意处理借位。
八、高精度乘法
#include
#include
using namespace std;
int main()
{
string str1,str2;
int a[250],b[250],c[500],len; //250位以内的两个数相乘
int i,j;
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[i]=str1[a[0]-i]-'0';
b[0]=str2.length();
for(i=1;i<=b[0];i++)
b[i]=str2[b[0]-i]-'0';
memset(c,0,sizeof(c));
for(i=1;i<=a[0];i++) //做按位乘法同时处理进位,注意循环内语句的写法。
for(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;
}
len=a[0]+b[0]+1; //去掉最高位的0,然后输出
while((c[len]==0)&&(len>1)) len--; //为什么此处要len>1??
for(i=len;i>=1;i--)
cout<<c[i];
return 0;
}
注意:两个数相乘,结果的位数应该是这两个数的位数和减1。
优化:万进制
#include
#include
using namespace std;
void num1(int s[],string st1);
int a[2501],b[2501],c[5002];//此处可以进行2500位万进制乘法,即10000位十进制乘法。
Int main()
{
string str1,str2;
int len;
cin>>str1>>str2;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
num1(a,str1); //把str1从最低位开始,每4位存放在数组a中
num1(b,str2); //把str2从最低位开始,每4位存放在数组b中
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]/10000;
c[i+j-1]%=10000;
}
len=a[0]+b[0];//a[0]和b[0]存放的是每个数按4位处理的位数
while ((c[len]==0)&&(len>1)) len--;//去掉高位的0,并输出最高位
cout<<c[len];
for(int i=len-1;i>=1;i--)//把剩下来的每一位还原成4位输出
{
if (c[i]<1000) cout<<’0’;
if (c[i]<100) cout<<’0’;
if (c[i]<10) cout<<’0’;
cout<<c[i];
}
cout<<endl;
return 0;
}
void num1(int s[],string st1)//此函数的作用就是把字符串st1,按4位一组存放在数组s中
{ int k=1,count=1;
s[0]=st1.length();//存放st1的长度,省去一长度变量
for(int i=s[0]-1;i>=0;i--) //从最低位开始,处理每一位
{ if (count%4==0) {s[k]+=(st1[i]-‘0’)*1000; if(i!=0) k++;}
if (count%4==1) s[k]=(st1[i]-‘0’);
if (count%4==2) s[k]+=(st1[i]-‘0’)*10;
if (count%4==3) s[k]+=(st1[i]-‘0’)*100;
count++;
}
s[0]=k; //存放数组的位数,就是按4位处理后的万进制数的位数。
Return;
}
PS:除法参考乘法