题目参考**《"101计划"核心课程实践教材《数据结构实验指导 - C语言版》题目集》**第十九题。
个人测试无误,个人代码,个人考研记录,仅供参考算法思想。
代码如下:
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_INPUT_LENGTH 1005
#define PLUS 0
#define MINUS 1
void myreverse(char* lt) {
if (!lt)
return;
int lt_length = strlen(lt);
int loop_times = lt_length / 2;
char temp;
for (int i = 0; i < loop_times; ++i) {
temp = lt[i];
lt[i] = lt[lt_length - i - 1];
lt[lt_length - i - 1] = temp;
}
}
void stripfirst(char a[]) {
int a_len = strlen(a);
for (int i = 0; i < a_len - 1; ++i)
a[i] = a[i + 1];
a[a_len - 1] = 0;
}
void addfirst(char* answer, char sign) {
if (!answer)
return;
int a_len = strlen(answer);
if (a_len + 2 >= MAX_INPUT_LENGTH)
return;
for (int i = a_len; i > 0; --i)
answer[i] = answer[i - 1];
answer[a_len + 1] = '\0';
answer[0] = sign;
}
int numcmp(char* a, char* b) {
int a_len = strlen(a), b_len = strlen(b);
if (a_len > b_len)
return 1;
else if (a_len < b_len)
return 0;
else
return strcmp(a, b);
}
int getzero(char* answer) {
int zero = 0, length = strlen(answer);
for (int i = 0; i < length; ++i) {
if (answer[i] != '0')
break;
++zero;
}
return zero;
}
char* myadd(char a[], char b[]) {
char* answer = NULL;
if (!(answer = (char*)malloc(sizeof(char) * (MAX_INPUT_LENGTH + 3)))) {
puts("分配失败!");
return NULL;
}
myreverse(a);
myreverse(b);
int a_len = strlen(a), b_len = strlen(b), max_len = (a_len > b_len) ? (a_len) : (b_len);
int index, sum, carry = 0;
char aa, bb;
for (index = 0; index < max_len; ++index) {
aa = (index < a_len) ? (a[index] - '0') : (0);
bb = (index < b_len) ? (b[index] - '0') : (0);
sum = aa + bb + carry;
answer[index] = sum % 10 + '0';
carry = sum / 10;
}
if (carry)
answer[index++] = carry + '0';
answer[index] = '\0';
myreverse(answer);
return answer;
}
char* mymulti(char a[], char b[]) {
char* answer = NULL;
if (!(answer = (char*)malloc(sizeof(char) * MAX_INPUT_LENGTH * 2))) {
puts("分配失败!");
return NULL;
}
myreverse(a);
myreverse(b);
int a_len = strlen(a), b_len = strlen(b);
int* record = (int*)calloc(a_len + b_len, sizeof(int));
if (!record) {
puts("分配失败!");
return NULL;
}
int temp;
for (int i = 0; i < a_len; ++i) {
temp = a[i] - '0';
for (int j = 0; j < b_len; ++j)
record[i + j] += (temp * (b[j] - '0'));
}
int max_len = a_len + b_len;
int index, sum, carry = 0;
for (index = 0; index < max_len; ++index) {
sum = record[index] + carry;
answer[index] = sum % 10 + '0';
carry = sum / 10;
}
while (carry) {
answer[index++] = carry % 10 + '0';
carry /= 10;
}
answer[index] = '\0';
myreverse(answer);
free(record);
char* temp_answer = NULL;
int answer_length = strlen(answer);
if (!(temp_answer = (char*)malloc(sizeof(char) * answer_length + 10))) {
puts("分配失败!\n");
return answer;
}
int zero_num = getzero(answer);
int i;
for (i = 0; i < answer_length - zero_num; ++i) {
temp_answer[i] = answer[i + zero_num];
}
temp_answer[i] = '\0';
free(answer);
return temp_answer;
}
char* _myminus(char max[], char min[]) { //a > b
char* answer = NULL;
if (!(answer = (char*)malloc(sizeof(char) * MAX_INPUT_LENGTH))) {
puts("分配失败!");
return NULL;
}
myreverse(max);
myreverse(min);
int max_lt_len = strlen(max), min_lt_len = strlen(min);
int max_length = (max_lt_len > min_lt_len) ? (max_lt_len) : (min_lt_len);
int index, sum, lent = 0, aa, bb;
for (index = 0; index < max_length; ++index) {
aa = (index < max_lt_len) ? (max[index] - '0') : (0);
bb = (index < min_lt_len) ? (min[index] - '0') : (0);
sum = aa - bb - lent;
lent = 0;
if (sum < 0) {
sum += 10;
lent = 1;
}
answer[index] = sum % 10 + '0';
}
answer[index++] = '\0';
myreverse(answer);
return answer;
}
char* myminus(char a[], char b[]) {
char* answer = NULL;
char sign_a = (a[0] == '-') ? (MINUS) : (PLUS);
char sign_b = (b[0] == '-') ? (MINUS) : (PLUS);
int change_sign;
char* temp = NULL;
if (sign_a == PLUS && sign_b == PLUS) {
answer = myadd(a, b);
}
else if (sign_a == MINUS && sign_b == MINUS) {
stripfirst(a);
stripfirst(b);
answer = myadd(a, b);
addfirst(answer, '-');
}
else if (sign_a == PLUS && sign_b == MINUS) {
stripfirst(b);
change_sign = 0;
if (numcmp(a, b) < 0) {
temp = a;
a = b;
b = temp;
change_sign = 1;
}
answer = _myminus(a, b);
if (change_sign)
addfirst(answer, '-');
}
else if (sign_a == MINUS && sign_b == PLUS) {
stripfirst(a);
change_sign = 1;
if (numcmp(a, b) < 0) {
temp = a;
a = b;
b = a;
change_sign = 0;
}
answer = _myminus(a, b);
if (change_sign)
addfirst(answer, '-');
}
char* temp_answer = NULL;
int answer_length = strlen(answer);
int zero = getzero(answer);
if (zero) {
if (!(temp_answer = (char*)malloc(sizeof(char) * (answer_length + 10)))) {
puts("分配失败!");
return answer;
}
int i;
for (i = 0; i < answer_length - zero; ++i)
temp_answer[i] = answer[i + zero];
temp_answer[i] = '\0';
free(answer);
return temp_answer;
}
return answer;
}
int main() {
char a[MAX_INPUT_LENGTH], b[MAX_INPUT_LENGTH];
puts("请输入两行数字: (负数需要带符号)");
scanf("%s", a);
scanf("%s", b);
char* answer = NULL;
int option;
puts("请输入操作符: (1加 2减 3乘)");
scanf("%d", &option);
switch (option) {
case 1:
answer = myadd(a, b);
break;
case 2:
answer = myminus(a, b);
break;
case 3:
answer = mymulti(a, b);
break;
default:
break;
}
if (!answer)
return 1;
printf("答案:%s\n", answer);
free(answer);
return 0;
}
加法测试:


减法测试:




乘法测试:

