//作者:石门实验学校105王逸伦
//题目:高精度乘法,减法
//tips:本程序高精度数输入方法为:‘XXXXXX!’,以‘!’结尾
#include
#include
#include
int ans[1000000];
using namespace std;
void _in(int a[],int &len);//输入高精度数
void _turn(int a[],int len);//将高精度数翻转
void _gjdcf(int a[],int b[],int ans[],int len1,int len2,int &len);//高精度乘法
void _out(int a[],int len,bool fh);//输出高精度数
void _gjdjf(int a[],int b[],int ans[],int len1,int len2,int &len);//高精度减法
bool _bj(int a[],int b[],int len1,int len2);//比较高精度数
//主程序:
int main()
{
bool fh;
int a[100000],b[100000],len1=0,len2=0,len=0,mode;
memset(ans,0,sizeof(ans));
cout <<"作者:石门实验学校105王逸伦 "<> mode;
cout << "本程序高精度数输入方法为:‘XXXXXX!’,以‘!’结尾 "<len2) _gjdcf(a,b,ans,len1,len2,len); //确保位数多的在上方(竖式乘法)
else _gjdcf(b,a,ans,len2,len1,len);
fh=true;
}
else
{
if (_bj(a,b,len1,len2)) {_gjdjf(a,b,ans,len1,len2,len);fh=true;}//确保大数减小数,记录符号
else {_gjdjf(b,a,ans,len2,len1,len);fh=false;}
}
_out(ans,len,fh);//将高精度数输出(结果)
}
void _out(int a[],int len,bool fh)
{
_turn(a,len);
int i=0;
while (a[i]==0)i++;
if (!fh) cout << '-';
for (;i<=len-1;i++) cout << a[i]; //倒序输出
}
void _turn(int a[],int len)
{
int j=len-1;
for(int i=0;i> ch;
if (ch=='!') break; //高精度数以‘!’结尾
a[len]=int(ch-48); //转数字
len++;
}
_turn(a,len); //从个位开始,调转,方便下面计算
}
void _gjdcf( int a[],int b[],int ans[],int len1,int len2,int &len)
{
int jw=0,dq=0; //jw为进位,dq为当前数(未%10)
for(int i=0;i<=len1-1;i++)
for(int j=0;j<=len2-1;j++)
{
dq=ans[i+j]+a[i]*a[j]+jw;
ans[i+j]=dq % 10; //取个位
jw=dq / 10;//算进位
}
len=len1+len2-1;//未进位长度
for (;jw>0;jw/=10) ans[len++] =jw % 10;//其余进位
}
void _gjdjf(int a[],int b[],int ans[],int len1,int len2,int &len)
{
int tw=0;
for (int i=0;i<=len1-1;i++)
{
if ((a[i]-b[i]-tw)<0) //判断是否需要退位
{
ans[i]=a[i]-b[i]-tw+10;
tw=1;
}
else
{
ans[i]=a[i]-b[i]-tw;
tw=0;
}
//cout << i<<' '<len2) return true;
else if (len2>len1) return false; //先比较长度
for (int i=0;i<=len1-1;i++)
if (a[i]>b[i]) return true;
else if (b[i]>a[i]) return false;//逐个比较
return true; //相同
}