简单大数加法
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char p[100] = {"999"}, q[100] = {"1"};
// 大数加法--可以实现连加 p+q
// 大数p, q相加 再把结果放在p
void add(char* p, char* q) {
int i, j, t = 0, k = 0;
for (i = 0, j = 0; p[i] != '\0' && q[j] != '\0'; i++,j++) {
t = (p[i] - '0') + (q[j] - '0') + t;
p[k++] = t % 10 + '0';
t /= 10;
}
// 假如这个数更长,更短的话不用考虑
while (q[j] != '\0') {
t = (q[j] - '0') + t;
p[k++] = t % 10 + '0';
t /= 10;
j++;
}
// p[k]要是原来有数还要再加上本身这个数,再考虑进位
while (t) {
if (p[k] >= '0' && p[k] <= '9') t = (p[k]-'0') + t;
p[k++] = t % 10 + '0';
t /= 10;
}
}
int main() {
int len = strlen(p), lek = strlen(q);
for (int i = 0; i < len/2; i++) swap(p[i], p[len-1-i]);
for (int i = 0; i < lek/2; i++) swap(q[i], q[lek-i-1]);
add(p, q);
for (int i = strlen(p)-1; i >= 0; i--) printf("%c", p[i]);
return 0;
}
简单大数减法, 默认大数p大于等于q,答案放在p里可以实现连减
#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
char p[100] = {"1000"}, q[100] = {"1000"};
// 大数减法--可以实现连减 p-q
void sub(char* p, char* q) {
int i, j;
int ans[1000] = {0},k = 0; // 借助整数会更好写,字符不好处理借位的
for (i = 0; p[i] != '\0'; i++) ans[i] = (p[i]-'0');
for (i = 0,j = 0; p[i] != '\0' && q[j] != '\0'; i++,j++) {
ans[k] = ans[k] - (q[j]-'0');
if (ans[k] < 0) {
ans[k] += 10;
ans[k+1]--;
}
k++;
}
while (ans[k] == -1) {
if (ans[k] < 0) {
ans[k] += 10;
ans[k+1]--;
}
k++;
i++;
if (ans[k] >= 0) break;
}
while (p[i]!='\0') {i++; k++;} // 使k等于原来的长度
// 开始去后导0
while (ans[k-1] == 0 && k-1 >= 0) k--;
for (i = 0; i < k; i++) p[i] = ans[i]+'0';
p[i] = '\0';
}
int main() {
int len = strlen(p), lek = strlen(q);
for (int i = 0; i < len/2; i++) swap(p[i], p[len-1-i]);
for (int i = 0; i < lek/2; i++) swap(q[i], q[lek-i-1]);
sub(p, q);
if (strlen(p) == 0) printf("0");
else for (int i = strlen(p)-1; i >= 0; i--) printf("%c", p[i]);
return 0;
}
简单大数乘法
#include<stdio.h>
#include<string.h>
#define MAX 1000 // 大数的最大位数
int Multiplication(char num1[],char num2[], int sum[]) {
int i, j, len, len1, len2;
int a[MAX+10] = {0};
int b[MAX+10] = {0};
int c[MAX*2+10] = {0};
len1 = strlen(num1);
len2 = strlen(num2);
for(j = 0, i = len1-1; i >= 0; i--) //把数字字符转换为整型数 并且倒过来低位在前
a[j++] = num1[i]-'0';
for(j = 0, i = len2-1; i >= 0; i--)
b[j++] = num2[i]-'0';
for(i = 0; i < len2; i++) { //用第二个数乘以第一个数,每次一位
for(j = 0; j < len1; j++) {
c[i+j+1] += b[i] * a[j]; //先乘起来,后面统一进位
}
}
for(i = 1; i < MAX*2; i++) { //循环统一处理进位问题
if(c[i] >= 10) {
c[i+1] += c[i] / 10;
c[i] %= 10;
}
}
len = MAX*2;
while (c[len] == 0 && len >= 1) len--; //跳过高位的0
for(; i >= 1; i--) sum[i] = c[i];
return len;
}
int main() {
int i, len;
int sum[MAX*2+10] = {0}; // 存放计算的结果,低位在前,高位在后,即sum[0]是低位
char num1[] = "12"; // 第一个大数
char num2[] = "12"; // 第二个大数
len = Multiplication(num1, num2, sum);
// 输出结果
printf("%s * %s = \n", num1, num2);
for (i = len; i >= 1; i--) printf("%d", sum[i]);
printf("\n");
return 0;
}