#include <stdio.h> #include <string.h>

#define MAX_LEN 1000 //字符数组的最大长度

void reverse(char* str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } }

void add(char* a, char* b, char* result) { int carry = 0; int i = 0; while (a[i] != '\0' || b[i] != '\0' || carry != 0) { int sum = carry; if (a[i] != '\0') { sum += a[i] - '0'; } if (b[i] != '\0') { sum += b[i] - '0'; } result[i] = sum % 10 + '0'; carry = sum / 10; i++; } result[i] = '\0'; reverse(result); }

void subtract(char* a, char* b, char* result) { int borrow = 0; int i = 0; while (a[i] != '\0' || b[i] != '\0' || borrow != 0) { int diff = borrow; if (a[i] != '\0') { diff += a[i] - '0'; } if (b[i] != '\0') { diff -= b[i] - '0'; } if (diff < 0) { diff += 10; borrow = -1; } else { borrow = 0; } result[i] = diff + '0'; i++; } result[i] = '\0'; reverse(result); }

void multiply(char* a, char* b, char* result) { int len_a = strlen(a); int len_b = strlen(b); int* temp = new intlen_a + len_b; //用于存放临时结果 for (int i = 0; i < len_a; i++) { for (int j = 0; j < len_b; j++) { temp[i + j] += (a[i] - '0') * (b[j] - '0'); } } int carry = 0; int i = len_a + len_b - 1; while (i >= 0) { temp[i] += carry; carry = temp[i] / 10; temp[i] %= 10; i--; } i = len_a + len_b - 1; while (i >= 0 && temp[i] == 0) { i--; } if (i < 0) { result[0] = '0'; result[1] = '\0'; } else { int j = 0; while (i >= 0) { result[j] = temp[i] + '0'; i--; j++; } result[j] = '\0'; } reverse(result); delete[] temp; }

void divide(char* a, char* b, char* quotient, char* remainder) { int len_a = strlen(a); int len_b = strlen(b); if (len_b == 1 && b[0] == '0') { //除数为0的情况 quotient[0] = '0'; quotient[1] = '\0'; remainder[0] = '0'; remainder[1] = '\0'; return; } if (len_a < len_b) { //被除数小于除数的情况 quotient[0] = '0'; quotient[1] = '\0'; strcpy(remainder, a); return; } int* dividend = new intlen_a; //被除数 int* divisor = new intlen_b; //除数 int* temp = new intlen_a; //用于存放临时结果 for (int i = 0; i < len_a; i++) { dividend[i] = a[i] - '0'; } for (int i = 0; i < len_b; i++) { divisor[i] = b[i] - '0'; } int len_q = len_a - len_b + 1; //商的长度 for (int i = len_q - 1; i >= 0; i--) { int j = i + len_b - 1; while (dividend[j] == 0 && j >= i + len_b - 1) { j--; } if (j < i) { temp[i] = 0; } else { int k = j; int carry = 0; while (k >= i) { int quotient = (dividend[k] + carry * 10) / divisor[len_b - j + k - 1]; int remainder = (dividend[k] + carry * 10) % divisor[len_b - j + k - 1]; if (len_b - j + k - 1 == len_b - 1 && quotient == 0) { k--; continue; } carry = quotient; temp[i] += remainder * 10; k--; } temp[i] /= 10; } } int i = len_q - 1; while (i >= 0 && temp[i] == 0) { i--; } if (i < 0) { quotient[0] = '0'; quotient[1] = '\0'; } else { int j = 0; while (i >= 0) { quotient[j] = temp[i] + '0'; i--; j++; } quotient[j] = '\0'; } reverse(quotient); int len_r = len_b - 1; //余数的长度 i = len_r; while (dividend[i] == 0 && i < len_a) { i++; } if (i >= len_a) { remainder[0] = '0'; remainder[1] = '\0'; } else { int j = 0; while (i < len_a) { remainder[j] = dividend[i] + '0'; i++; j++; } remainder[j] = '\0'; } delete[] dividend; delete[] divisor; delete[] temp; }

void operate(char* a, char* b, char* result, char op) { char sign_a = '+'; //记录a的符号 char sign_b = '+'; //记录b的符号 char* temp_a = a; //临时指针,用于移动数组下标 char* temp_b = b; //临时指针,用于移动数组下标 if (a == '+') { //处理a的符号 temp_a++; } else if (a == '-') { sign_a = '-'; temp_a++; } if (b == '+') { //处理b的符号 temp_b++; } else if (b == '-') { sign_b = '-'; temp_b++; } switch (op) { case '+': { if (sign_a == sign_b) { //同号相加 add(temp_a, temp_b, result); if (sign_a == '-') { //结果为负数 char temp = new charMAX_LEN; temp[0] = '-'; strcat(temp, result); strcpy(result, temp); delete[] temp; } } else { //异号相减 char temp = new charMAX_LEN; if (sign_a == '+') { //a为正数,b为负数 subtract(temp_a, temp_b, temp); strcpy(result, temp); } else { //a为负数,b为正数 subtract(temp_b, temp_a, temp); strcpy(result, temp); } if (temp != '0') { //结果不为0时加上负号 result[strlen(result) + 1] = '\0'; for (int i = strlen(result); i >= 1; i--) { result[i] = result[i - 1]; } result[0] = '-'; } delete[] temp; } break; } case '-': { if (sign_b == '-') { //变为加法运算 b[0] = '+'; operate(a, b, result, '+'); b[0] = '-'; } else { //变为减法运算 if (sign_a == '-') { //a为负数 char temp = new charMAX_LEN; temp[0] = '+'; strcat(temp, temp_a); operate(temp, b, result, '+'); delete[] temp; } else { //a为正数 subtract(temp_a, temp_b, result); } if (result != '0') { //结果为负数时加上负号 result[strlen(result) + 1] = '\0'; for (int i = strlen(result); i >= 1; i--) { result[i] = result[i - 1]; } result[0] = '-'; } } break; } case '': { multiply(temp_a, temp_b, result); if (sign_a != sign_b) { //结果为负数时加上负号 result[strlen(result) + 1] = '\0'; for (int i = strlen(result); i >= 1; i--) { result[i] = result[i - 1]; } result[0] = '-'; } break; } case '/': { char temp_quotient = new charMAX_LEN; char temp_remainder = new charMAX_LEN; divide(temp_a, temp_b, temp_quotient, temp_remainder); strcpy(result, temp_quotient); if (sign_a != sign_b) { //商为负数时加上负号 result[strlen(result) + 1] = '\0'; for (int i = strlen(result); i >= 1; i--) { result[i] = result[i - 1]; } result[0] = '-'; } delete[] temp_quotient; delete[] temp_remainder; break; } case '%': { char* temp_quotient = new charMAX_LEN; char* temp_remainder = new charMAX_LEN; divide(temp_a, temp_b, temp_quotient, temp_remainder); strcpy(result, temp_remainder); if (sign_a == '-') { //余数为负数时加上负号 result[strlen(result) + 1] = '\0'; for (int i = strlen(result); i >= 1; i--) { result[i] = result[i - 1]; } result[0] = '-'; } delete[] temp_quotient; delete[] temp_remainder; break; } } }

int main() { char a[MAX_LEN] = ''; //存放大整数a的字符数组 char b[MAX_LEN] = ''; //存放大整数b的字符数组 char result[MAX_LEN] = ''; //存放结果的字符数组 char op; //存放运算符 printf('请输入大整数a:'); scanf('%s', a); printf('请输入大整数b:'); scanf('%s', b); printf('请输入运算符(+、-、*、/、%%中的一种):'); scanf(' %c', &op); //注意空格的处理 operate(a, b, result, op); printf('结果为:%s\n', result); return 0; }

C语言实现大整数加减乘除运算:二进制字符数组表示法

原文地址: https://www.cveoy.top/t/topic/nKqr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录