您的位置:首页 > 其它

高精度减法,高精度乘法

2015-08-24 18:59 274 查看
高精度减法

oj数据偏弱如果添加一个101-2就错了,下面这一步是为了防止错误的

if(a[aa]<’0’)

{

a[aa]+=10;

a[aa-1]–;

}

可能出现第一位的1被借走的的情况,所以加一个while找第一个不是0的

while(c[i]<=’0’)

i–;

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
string a,b,c,temp;
cin>>a>>b;
if((a.length()<b.length())||(a.length()==b.length()&&a[0]<b[0]))
{
cout<<"-";
temp=a;
a=b;
b=temp;
}
int i=0;
int aa=a.length()-1;
int bb=b.length()-1;
while(bb>=0)
{
if(b[bb]<=a[aa])
{
c[i++]=a[aa--]-b[bb--]+'0';
}else{
a[aa-1]--;
a[aa]=a[aa]+10;
c[i++]=a[aa--]-b[bb--]+'0';
}
}
while(aa>=0)
{
if(a[aa]<'0')
{
a[aa]+=10;
a[aa-1]--;
}
c[i++]=a[aa--];
}
while(c[i]<='0')
i--;
for(int k=i;k>=0;k--)
{
cout<<c[k];
}
return 0;
}


高精度乘法

注意一下,字符向数组的转换。

主要思路就是两个数字相乘,第一个数字的第i位乘以第二个数字的第j位得到的将是第三个数字的第i+j位;注意一下得到数 的某一位是否大于10;

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int al,bl;
al=a.length();
bl=b.length();
int aa[1005],bb[1005];
int c[2010]={0};
for(int i=0;i<al;i++)
{
aa[al-i-1]=a[i]-'0';
}
for(int i=0;i<bl;i++)
{
bb[bl-i-1]=b[i]-'0';
}
for(int i=0;i<al;i++)
{
for(int j=0;j<bl;j++)
{
c[i+j]=aa[i]*bb[j]+c[i+j];
}
}
for(int i=0;i<al+bl;i++)
{
if(c[i]>9)
{
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
}
int cl=al+bl;
while(cl>0&&c[cl]==0)
cl--;
for(int i=cl;i>=0;i--)
cout<<c[i];
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: