高精度加法
洛谷对应题目:P1601
#include<iostream>
#include<cstring>
using namespace std;
int a[101], b[101];//存储s1、s2的字符串,
int c[101];//最终结果
string s1, s2;
//字符串反转 让两个数的个位对齐运算
void strtoint(string s, int a[])
{
for (int i = 0; i <s.size(); i++)
{
a[s.size() - i] = s[i] - '0';
}
}
int main()
{
cin >> s1 >> s2;
//1.字符串反转
strtoint(s1, a);
strtoint(s2, b);
int la = s1.size();
int lb = s2.size();
//2.计算最后结果的位数,取最长位+1
int lc = max(la, lb) + 1;
//2.运算
for (int i = 1; i <= lc; i++)
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;//进位
c[i] %= 10;//留当前的位数
}
//3.去除前导0
while (c[lc] == 0 && lc > 1) lc--;
//4.倒序输出
for (int i = lc; i >= 1; i--)
{
cout << c[i];
}
return 0;
}
高精度减法
#include<iostream>
#include<cstring>
using namespace std;
int a[10500], b[10500];//分别存放s1,s2
int c[10500];//存放最终结果
string s1, s2;
void strtoint(string s, int arr[])
{
for (int i = 0; i < s.size(); i++)
{
arr[s.size() - i] = s[i] - '0';//反转同时转化成int型
}
}
bool strcmp(string s1, string s2)
{
if (s1.size() != s2.size())
{
return s1.size()>=s2.size();
}
else
{
return s1 >= s2;
}
}
int main()
{
cin >> s1 >> s2;
if (strcmp(s1, s2) == false) //false代表s1<s2
{
swap(s1, s2);//大数减小数好减
cout << "-";
}
strtoint(s1, a);
strtoint(s2, b);
int la = s1.size();
int lb = s2.size();
int lc = max(la, lb);
for (int i = 1; i <= lc; i++)
{
if (a[i] < b[i])
{
a[i + 1]--; //借位
a[i] += 10;//借1当10用
}
c[i] = a[i] - b[i];//当a[i]>b[i]时,直接减
}
while (c[lc] == 0 && lc > 1) lc--;
for (int i = lc; i >= 1; i--)
{
cout << c[i];
}
}
高精度乘法
#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 100500;
int a[MAX], b[MAX];
int c[MAX];
string s1, s2;
//字符串倒置,并且转化成int型 通过减去字符‘0’实现
void strtoint(string s, int arr[])
{
for (int i = 0; i <= s.size(); i++)
{
arr[s.size() - i] = s[i] - '0';
}
}
int main()
{
cin >> s1 >> s2;
strtoint(s1, a);
strtoint(s2, b);
int la = s1.size();
int lb = s2.size();
int lc = la + lb;//结果的最长位数
//2.运算
for (int i = 1; i <= la; i++)
{
for (int j = 1; j <= lb; j++)
{
c[i + j - 1] += a[i] * b[j];//推出通项式
c[i + j] += c[i + j - 1] / 10;//下一位要进位
c[i + j - 1] %= 10;//当前位数保留个位
}
}
//3.去除前导0
while (c[lc] == 0 && lc > 1) lc--;
//4.倒序输出
for (int k = lc ;k >=1; k--)
{
cout << c[k];
}
}
高精度除法
#include<iostream>
#include<cstring>
using namespace std;
char s[10001];
long long b, c[10001], d, a[10001], len, lenc;
int main()
{
cin >> s >> b;//读入被除数和除数
len = strlen(s);//把被除数的位数存在len里
for (int i = 1; i <= len; i++)a[i] = s[i - 1] - '0';//将被除数一位一位放入a数组
for (int i = 1; i <= len; ++i)//这一个循环是关键,将被除数一位一位除以除数,不够除,向下
{ //一位借位,d为余数,c数组为商
c[i] = (d * 10 + a[i]) / b;
d = (d * 10 + a[i]) % b;
}
lenc = 1;
while (c[lenc] == 0 && lenc < len)lenc++;//删除前导0
for (int i = lenc; i <= len; ++i)cout << c[i]; //输出结果
return 0;
}