如果输入数据是long long 一下的话, 用这些勉强算是高精度的算法会比较快
//这是该大数算法的必须构造的数组形式
s[1] = a;
while(s[len] >= 10){
s[len + 1] += s[len] / 10;
s[len] %= 10;
++len;
}
乘法(可以算输入数据为long long时的大数相乘)
#include <iostream>
using namespace std;
typedef long long ll;
ll s[1000]; // 储存结果
ll len = 1;
void multi(ll x){
for(int i = 1; i <= len; ++i){
s[i] *= x;
}
for(int i = 1; i <= len; ++i){
if(s[i] >= 10){
s[i + 1] += s[i] / 10;
s[i] %= 10;
}
}
// 如果最高位有进位的话长度加一
++len;
// 去掉最高位面前的0 如0123 0就可以不要
while(s[len] == 0) --len;
}
void solve(){
ll a, b;
cin >> a >> b;
// 先处理一下数据,让高位聚集在数组尾部,便于之后的处理
s[1] = a;
while(s[len] >= 10){
s[len + 1] += s[len] / 10;
s[len] %= 10;
++len;
}
multi(b);
for(int i = len; i >= 1; --i){
cout << s[i];
}
}
int main(){
solve();
return 0;
}
除法(可以算输入数据为long long时的大数相除, 被除数可以是大数)
#include <iostream>
using namespace std;
typedef long long ll;
ll s[1000]; // 储存结果
ll len = 1;
void divis(ll b){
// 除以单个数 如果不够除让高位数和低位相加
for(int i = len; i >= 1; --i){
s[i - 1] += (s[i] % b) * 10;
s[i] /= b;
}
while(s[len] == 0) --len;
}
void solve(){
ll a, b;
cin >> a >> b;
s[1] = a;
// 让高位数据聚集在尾部
while(s[len] >= 10){
s[len + 1] += s[len] / 10;
s[len] %= 10;
++len;
}
divis(b);
if(len <= 0) cout << 0;
else{
for(int i = len; i >= 1; --i) cout << s[i];
}
}
int main(){
solve();
return 0;
}
加法(可以算输入数据为long long时的大数相除, 被加数可以是大数,减数可以用大数表示,这样就可以进行更高精度的运算了)
#include <iostream>
using namespace std;
typedef long long ll;
ll s[10000];
int len = 1;
void add(ll b){
int i = 1;
// b % 10 先取出个位数 跟个位数相加
// b也可以用数组储存,这样数字就不在局限于long long 了
while(b){
s[i] += b % 10;
b /= 10;
++i;
}
len = max(len, i);
for(int i = 1; i <= len; ++i){
if(s[i] >= 10){
s[i + 1] += s[i] / 10;
s[i] %= 10;
}
}
++len; // 如果最高位有进位的话,长度加一
while(s[len] == 0) --len;
}
void solve(){
ll a, b;
cin >> a >> b;
// 让高位的数据聚集在尾部
s[1] = a;
while(s[len] >= 10){
s[len + 1] += s[len] / 10;
s[len] %= 10;
++len;
}
add(b);
if(len > 0)
for(int i = len; i >= 1; --i) cout << s[i];
else cout << 0;
}
int main(){
solve();
return 0;
}
减法(可以算输入数据为long long时的大数相除, 被减数可以是大数,加数可以用大数表示,这样就可以进行更高精度的运算了)
#include <iostream>
using namespace std;
typedef long long ll;
int s[1000];
int len = 1;
void sub(ll a){
int i = 1;
// 这个 a取出个位数是可以用 像是存储大数数据的s[len] 来表示的 这是跟加法相似的
while(a){
s[i] -= a % 10;
a /= 10;
++i;
}
len = max(len, i);
for(int i = 1; i <= len; ++i){
if(s[i] < 0){
// 如果小于0, 要向高位取1, 高位就要减一
s[i] += 10;
--s[i + 1];
}
}
while(s[len] == 0) --len;
}
void solve(){
ll a, b;
cin >> a >> b;
// 让高位的数据聚集在尾部
s[1] = a;
while(s[len] >= 10){
s[len + 1] += s[len] / 10;
s[len] %= 10;
++len;
}
sub(b);
for(int i = len; i >= 1; --i){
cout << s[i];
}
}
int main(){
solve();
return 0;
}
更高精度的运算速度是会降低的,但是如果数据不是特别大的话,这些已经够用了。后面更高精度的运算,下篇博客再写吧!