一丶高精度加法
高精度加法是高精度算法里面最容易思考的一个;其实现过程并不难;注意的地方应该是进位的问题;
思路:我们可以设两个数组a[10090],b[10090],这两个数组的作用是用来存储高精度数的数位;
string类型字符串str1,str2(用来输入数据);
然后贴代码
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[10090],b[10090];
int main()
{ memset(a,0,sizeof(a));//先将数组清零;
memset(a,0,sizeof(b));
int n;
string str1,str2;
cin>>str1>>str2;
n=str1.length();
for(int i=1;i<=n;i++)
{
a[i]=str1[n-i]-'0';//这一步是将字符转换成数字并且倒序存入数组中;
}
int n2=str2.length();
for(int i=1;i<=n2;i++)
{
b[i]=str2[n2-i]-'0';//同上;
}
int len;
len=(n>n2?n:n2);//len的值是n与n2中较大的;
//我们不需要知道a,b数组哪个长度较长,我们只需要用a数组来进行相加操作;
for(int i=1;i<=len;i++)
{
a[i]+=b[i];//相加,没什么好说的;
a[i+1]+=a[i]/10;//进位;
a[i]%=10;//取余;
}
if(a[len+1])//两个数相加,可能出现进1位的可能;
len++;
for(int i=len;i>=1;i--)//输出;
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
二丶高精度减法
高精度减法比加法要麻烦一点;具体表现在需要考虑借位的问题
先贴一波代码,明天再更新~
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[190044],b[189449];
int main()
{
string str1,str2;
cin>>str1>>str2;
int n;
n=str1.length();
memset(a,0,sizeof(a));
memset(a,0,sizeof(b));
for(int i=1; i<=n; i++)
{
a[i]=str1[n-i]-'0';
}
int n2=str2.length();
for(int i=1; i<=n2; i++)
{
b[i]=str2[n2-i]-'0';
}//这里和加法是一样的
int c=0;
if(n==n2)//这里主要是通过c的值来判断a,b的取值哪个更大;
{
for(int i=n; i>=1; i--)
{
if(a[i]<b[i])
{
c=1;
break;
}
else if(a[i]>b[i])
{
c=2;
break;
}
}
if(!c)printf("0\n");//如果a,b的长度相等且c还为0,则这两个值相等
}
if(n>n2||c==2)//这里是a>b的情况下
{
for(int i=1; i<=n; i++)
{
a[i]-=b[i];//先进行减法操作
if(a[i]<0)//如果出现借位的情况
{
a[i]=-a[i];//借位就代表+10再-b;
a[i]=10-a[i];
a[i+1]--;
}
}
while(!a[n])n--;//这里是去掉前导0;
for(int i=n; i>=1; i--)
{
printf("%d",a[i]);
}
}
else if(n2>n||c==1)//这里是b>a的情况,同上;
{
for(int i=1; i<=n2; i++)
{
b[i]-=a[i];
if(b[i]<0)
{
b[i]=-b[i];
b[i]=10-b[i];
b[i+1]--;
}
}
while(!b[n2])n2--;
printf("-");//注意细节;
for(int i=n2; i>=1; i--)
{
printf("%d",b[i]);
}
}
printf("\n");
return 0;
}
这个代码并不完美;在做的过程中遇到了各种各样的错误,然而这些错误是粗心导致,以至于糊里糊涂WA了几发;贴在这里引以为戒;
#include<iostream>
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()<s2.length()) return 1;
for(int i=0;i<=s1.length();i++) //长度相同时,就一位一位比较。
{
if(s1[i]>s2[i]) return 0;
if(s1[i]<s2[i]) return 1;
}
return 0; //如果长度相同,每一位也一样,就返回0,说明相等
}
标准代码;
下一篇要做乘法和除法了;再会~;