题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002
高精度加法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int a[maxn], b[maxn], c[maxn];
char s[maxn];
int init() {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s", s);
int lena = strlen(s), pos = 0;
for(int i=lena-1;i>=0;i--) a[pos++] = s[i] - '0';
scanf("%s", s);
pos = 0;
int lenb = strlen(s);
for(int i=lenb-1;i>=0;i--) b[pos++] = s[i] - '0';
return max(lena, lenb);
}
void add(int len) {
int sum = 0;
for(int i=0;i<=len;i++) {
c[i] = (a[i] + b[i] + sum/10) % 10;
sum = (a[i] + b[i] + sum/10);
}
}
void Print(int len) {
if(c[len] != 0) len++;
for(int i=len-1;i>=0;i--) {
printf("%d", c[i]);
}
printf("\n");
}
int main() {
freopen("1.in", "r", stdin);
int t; scanf("%d", &t);
int T = 1;
while(t--) {
int len = init();
add(len);
Print(len);
}
}
java:
package Main;
import java.math.*;
import java.util.Scanner;
public class contest {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger a, b, c;
Scanner sc = new Scanner(System.in);
a = sc.nextBigInteger();
b = sc.nextBigInteger();
c = a.add(b);
System.out.println(c);
}
}
python:
a, b = [int(i), for i in input().split(' ')]
print(a+b)
题目链接:https://www.luogu.org/problemnew/show/P2142
高精度减法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 11000;
int a[maxn], b[maxn], c[maxn];
char s1[maxn], s2[maxn];
void change(char *s, int len, int *k) {
int pos = 0;
for(int i=len-1;i>=0;i--) {
k[pos++] = s[i] - '0';
}
}
int init() {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s%s", s1, s2);
bool flag = false;
int len1 = strlen(s1), len2 = strlen(s2);
if(len1 < len2) flag = true;
if(len1 == len2) {
for (int i = len1 - 1; i >= 0; i--)
if (s1[i] > s2[i]) break;
else if (s1[i] < s2[i]) {
flag = true;
break;
}
}
if(flag) {
printf("-");
change(s2, len2, a);
change(s1, len1, b);
} else {
change(s1, len1, a);
change(s2, len2, b);
}
return max(len1, len2);
}
void Minus(int len) {
int up_pos = 0;
for(int i=0;i<len;i++) {
if(a[i] + up_pos < b[i]) {
c[i] = a[i] + up_pos + 10 - b[i];
up_pos = -1;
} else {
c[i] = a[i] + up_pos - b[i];
up_pos = 0;
}
}
}
void Print(int len) {
while(c[len] == 0 && len > 0) len--;
for(int i=len;i>=0;i--) {
printf("%d", c[i]);
}
printf("\n");
}
int main() {
freopen("1.in", "r", stdin);
int len = init();
Minus(len);
Print(len);
}
题目链接:https://www.luogu.org/problemnew/show/P1303
高精度乘法
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e6+100;
const int maxm = 2010;
int a[maxm], b[maxm], c[maxn], mult[maxm];
char s1[maxm], s2[maxm];
void change(char *s, int len, int *k) {
int pos = 0;
for(int i=len-1;i>=0;i--) {
k[pos++] = s[i] - '0';
}
}
void init() {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s%s", s1, s2);
int len1 = strlen(s1), len2 = strlen(s2);
change(s1, len1, a);
change(s2, len2, b);
}
void Mult() {
int pos = 0;
int len1 = strlen(s1), len2 = strlen(s2);
for(int i=0;i<maxm;i++) {
int up_va = 0;
for(int j=0;j<maxm;j++) {
int now = a[i] * b[j] + up_va;
mult[j] = now%10;
up_va = now/10;
}
for(int j=0;j<maxm;j++) {
c[j + pos] += mult[j];
}
pos++;
}
for(int i=0;i<maxn;i++) {
c[i + 1] += c[i] / 10;
c[i] = c[i] % 10;
}
}
void Print(int len) {
while(c[len] == 0 && len > 0) len--;
for(int i=len;i>=0;i--) {
printf("%d", c[i]);
}
printf("\n");
}
int main() {
freopen("1.in", "r", stdin);
init();
Mult();
Print(maxn-1);
return 0;
}