一.首先是高精度加法但是用数组来存储结果
#include<bits/stdc++.h>
using namespace std;
string a, b;
int c[100000];
int main() //高精度加法
{
//用数组来存储结果的方法
cin >> a >> b;
int len1 = a.length();
int len2 = b.length();
//反转字符串使其从低位到高位排列
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (len1 < len2) //多加一位为最高位的前进位
{
for (int i = 0;i <= len2 - len1;i++)
a = a + '0';
b = b + '0';
}
else if (len1 > len2)
{
for (int i = 0;i <= len1 - len2;i++)
b = b + '0';
a = a + '0';
}
else
{
a = a + '0';
b = b + '0';
}
int l = max(len1, len2);
int w = 0;
for (int i = 0;i <= l;i++)
{
int now = (a[i] - '0') + (b[i] - '0') + w;
c[i] = now % 10;
w = now / 10;
}
if (c[l] == 0) //判断其最后的长度
l = l - 1;
for (int i = l;i >= 0;i--)
{
cout << c[i];
}
}
二.高精度加法在c++字符串上运算
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
using namespace std;
int main() //高精度加法
{
//直接在字符串上计算的方法 ,结果为字符串
string a, b, res;
cin >> a >> b;
int len1 = a.length();
int len2 = b.length();
if (len1 < len2) //前补零,最高位可能进位的那位不补
{
for (int i = 0;i < len2 - len1;i++)
{
a = "0" + a;
}
len1 = len2;
}
else if (len1 > len2)
{
for (int i = 0;i < len1 - len2;i++)
{
b = "0" + b;
}
len2 = len1;
}
int now,jw=0; //当前位结果,以及进位
for(int i=len1-1;i>=0;i--)
{
now=a[i]-'0'+b[i]-'0'+jw;
jw=now/10;
res=char(now%10+'0') + res;
}
if(jw==1) //判断最高位是否要进位
res='1'+res;
cout<<res<<endl;
}
三.高精度减法(负数可以转化为整数运算)
eg.正数-负数=两个正数相加
#include<iostream>
#include<algorithm>
using namespace std;
string a, b;
int c[100000];
int main() //高精度减法
{
cin >> a >> b;
bool fs = 0; //判断结果是否为负数
int len1 = a.length();
int len2 = b.length();
//确保大数一定在前面,此模板只能两个大于零的数相减
//若两个数中含有负数,可转化其形式确保运算时,两数不是负数
if (len1 < len2)
{
swap(a, b);
fs = 1;
len1 = len1 + len2;
len2 = len1 - len2;
len1 = len1 - len2;
}
if (len1 == len2 && b > a)
{
swap(a, b);
fs = 1;
}
for (int i = 0;i < len1 - len2;i++) //小的那个数前补0
{
b = '0' + b;
}
int now;
for (int i = len1 - 1;i >= 0;i--) //从低位到高位减
{
now = a[i] - '0' - (b[i] - '0');
if (now < 0)
{
now = now + 10;
a[i - 1] = a[i - 1] - 1;
}
c[len1 - 1 - i] = now;
}
//删除前导零
while (c[len1 - 1] == 0 && len1 > 1) len1--;
if (fs == 1)
cout << "-";
for (int i = len1 - 1;i >= 0;i--)
{
cout << c[i];
}
}
四.高精度乘法(有技巧)
每个位和每个位相乘(而不是两数相乘,或者每一位乘以某个数)
对应位相乘(例如i和j)后的结果位置为i+j-1
#include<bits/stdc++.h>
using namespace std;
string a,b;
int res[100005];
int main() //高精度乘法
{
cin>>a>>b;
if(a=="0"||b=="0")
{
cout<<"0";
return 0;
}
int al=a.length();
int bl=b.length();
reverse(a.begin(),a.end()); //反转一下从小位到大位排列
reverse(b.begin(),b.end());
//每一位单独相乘 如果从1位开始3*2位结果因该在第4位,i+j-1
//但是如果从第0位开始的话,第2位乘以第2为结果为第三位,i=1,j=1,结果应该为i+j
for(int i=0;i<al;i++)
for(int j=0;j<bl;j++)
{
res[i+j]=res[i+j]+(a[i]-'0')*(b[j]-'0');
}
int w=0; //进位
for(int i=0;i<al+bl;i++)
{
res[i]=res[i]+w; //计算当前位的值
w=res[i]/10; //计算当前进位
res[i]=res[i]%10; //对10取余
}
//若从1开始,应判断i+j,否则判断i+j-1
int l;
if(res[al+bl-1]!=0) //结果长度判断
l=al+bl;
else
l=al+bl-1;
for(int i=l-1;i>=0;i--) //输出
{
cout<<res[i];
}
}
五.高精度除法(模拟竖列式除法)
数列式怎么算,就怎样模拟
#include<bits/stdc++.h>
using namespace std;
int a[5001];
int quotient[5001];
int main()
{
//思想,模拟数列式除法
string s;
int b;
cin >> s >> b;
reverse(s.begin(),s.end()); //反转
for (int i = 0;i < s.size();i++) //转为整数存入到数组中
a[i + 1] = s[i] - '0';
long long tmp = 0; //当前要除除数的值
for (int i = s.size();i >= 1;i--) //从高位到低位计算
{
tmp *= 10;
tmp += a[i];
quotient[i] = tmp / b;
tmp %= b;
}
int i = 5000;
for (;(i >= 2) && (quotient[i] == 0);i--);
for (;i >= 1;i--) //商
cout << quotient[i];
cout<<endl<<tmp; //余数,最后除不了剩下的数
}