高精度加法
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N], c[N], cnta = 0, cntb = 0;
int add(int a[],int b[],int c[],int cnta,int cntb)
{
int t = 0;//用于存储进位
int i;
for (i = 0; i < cnta||i<cntb; i++)
{
if (i < cnta)
t += a[i];
if (i < cntb)
t += b[i];
c[i] = t % 10;
t /= 10;
}
if (t)
c[i++] = 1;//补上进位
return i;
}
int main()
{
string sa, sb;
cin >> sa >> sb;
for (int i = sa.size() - 1; i >= 0; i--)//倒序存储sa
a[cnta++] = sa[i] - '0';
for (int i = sb.size() - 1; i >= 0; i--)//倒序存储sb
b[cntb++] = sb[i] - '0';
int cntc = add(a, b, c, cnta, cntb);
for (int i = cntc-1; i >= 0; i--)//倒序输出
printf("%d", c[i]);
return 0;
}
高精度减法
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N], c[N], cnta = 0, cntb = 0;
int sub(int a[],int b[],int c[],int cnta,int cntb)
{
int t = 0;//用于存储进位
int i;
for (i = 0; i < cnta; i++)
{
t = a[i] - t;
if (i < cntb)
t -= b[i];
c[i] = (t + 10) % 10;
if (t < 0)
t = 1;//向前一位借一
else
t = 0;
}
while (i > 1 && c[i - 1] == 0)//如果最前面一位是0,则删去,并且保证总长大于等于1
i--;
return i;
}
bool judge(int a[], int b[])//判断a和b的大小
{
if (cnta != cntb)//长度不相等
{
if (cnta > cntb)
return true;
else
return false;
}
else
for (int i = cnta-1; i >=0; i--)//长度相等,从后往前判断每一位的大小
{
if (a[i]!= b[i])
{
if (a[i] > b[i])
return true;
else
return false;
}
}
}
int main()
{
string sa, sb;
cin >> sa >> sb;
for (int i = sa.size() - 1; i >= 0; i--)//倒序存储sa
a[cnta++] = sa[i] - '0';
for (int i = sb.size() - 1; i >= 0; i--)//倒序存储sb
b[cntb++] = sb[i] - '0';
if (judge(a, b))
{
int cntc = sub(a, b, c, cnta, cntb);
for (int i = cntc - 1; i >= 0; i--)//倒序输出
printf("%d", c[i]);
}
else
{
int cntc = sub(b, a, c, cntb, cnta);//交换a和b
printf("-");//添加负号
for (int i = cntc - 1; i >= 0; i--)//倒序输出
printf("%d", c[i]);
}
return 0;
}
高精度乘法
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N], c[N], cnta = 0;
int mui(int a[],int b,int c[],int cnta)
{
int t = 0;//用于存储进位
int i;
for (i = 0; i < cnta; i++)
{
t += a[i] * b;
c[i] = t % 10;
t /= 10;
}
while (t)//记录剩余的t
{
c[i++] = t % 10;
t /= 10;
}
while (i > 1 && c[i-1] == 0)//删去最前面的0,并且保证总长度大于等于1
i--;
return i;
}
int main()
{
string sa;
int b;
cin >> sa >> b;
for (int i = sa.size() - 1; i >= 0; i--)//倒序存储sa
a[cnta++] = sa[i] - '0';
int cntc = mui(a, b, c, cnta);
for (int i = cntc - 1; i >= 0; i--)//倒序输出
printf("%d", c[i]);
return 0;
}
高精度除法
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N], c[N], cnta = 0,r=0;//r用于储存余数
int div(int a[],int b,int c[],int cnta)
{
int i;
for (i = cnta-1; i >=0 ; i--)//从数组的尾部开始计算
{
r = r * 10 + a[i];
c[i] = r / b;
r %= b;
}
i = cnta;
while (i > 1 && c[i-1] == 0)//删去最前面的0,并且保证总长度大于等于1
i--;
return i;
}
int main()
{
string sa;
int b;
cin >> sa >> b;
for (int i = sa.size() - 1; i >= 0; i--)//倒序存储sa
a[cnta++] = sa[i] - '0';
int cntc = div(a, b, c, cnta);
for (int i = cntc - 1; i >= 0; i--)//倒序输出
printf("%d", c[i]);
printf("\n");
printf("%d\n", r);
return 0;
}