一、CODE计算机组成原理作业:
用C语言实现大数的加减法
#include二、测试#include #include #include int num1[1000]; int num2[1000]; int res[1000];//存储计算结果 //输入数据 void input_data(char* str1, char* str2); //大数加法 void add(char* str1, char* str2); //大数减法 void sub(char* str1, char* str2); int main() { while (1) { printf("Enter the operation you want to perform.n"); printf("Addition -> 1n"); printf("Subtraction -> 2n"); printf("Exit program -> othernn"); int operand = 0; printf("operand : "); scanf("%d", &operand); printf("n"); char str1[1000], str2[1000]; switch (operand) { case 1: add(str1, str2); break; case 2: sub(str1, str2); break; default: exit(0); } printf("****************************************************nnn"); } return 0; } void input_data(char* str1, char* str2) { printf("Please enter a value for str1 : "); scanf("%s", str1); printf("Please enter a value for str2 : "); scanf("%s", str2); printf("n"); } void add(char* str1, char* str2) { input_data(str1, str2); int len1 = strlen(str1); int len2 = strlen(str2); int len = max(len1, len2); //数组初始化,即所有位赋 0 memset(num1, 0, sizeof(num1)); memset(num2, 0, sizeof(num2)); memset(res, 0, sizeof(res)); for (int i = 0; i < len1; i++) { num1[i] = str1[len1 - i - 1] - '0'; } for (int i = 0; i < len2; i++) { num2[i] = str2[len2 - i - 1] - '0'; } //carry 判断进位情况 int carry = 0; for (int i = 0; i < len; i++) { res[i] = (num1[i] + num2[i] + carry) % 10; carry = (num1[i] + num2[i] + carry) / 10; } if (carry != 0) { res[len++] = 1; } printf("The result is : n"); printf("%s + %s = ", str1, str2); for (int i = len - 1; i >= 0; i--) { printf("%d", res[i]); } printf("n"); } void sub(char* str1, char* str2) { input_data(str1, str2); int len1 = strlen(str1); int len2 = strlen(str2); int len = max(len1, len2); //数组初始化,即所有位赋 0 memset(num1, 0, sizeof(num1)); memset(num2, 0, sizeof(num2)); memset(res, 0, sizeof(res)); for (int i = 0; i < len1; i++) { num1[i] = str1[len1 - i - 1] - '0'; } for (int i = 0; i < len2; i++) { num2[i] = str2[len2 - i - 1] - '0'; } //判断两个数字的大小 // flag 的值为0,表示减数大于被减数,为1则反之 int flag = 1; if (len1 < len2) { flag = 0; } else if (len1 == len2) { int i = 0; //从最高位找出最早不同的一位 while (str1[i] == str2[i]) i++; flag = str1[i] > str2[i] ? 1 : 0; } printf("flag = %dn", flag); // borrow 用于判断借位情况 int borrow = 0; if (flag) { for (int i = 0; i < len; i++) { res[i] = num1[i] - num2[i] - borrow; //借位 if (res[i] < 0 && i + 1 < len) { borrow = 1; res[i] += 10; } else borrow = 0; } } else { for (int i = 0; i < len; i++) { res[i] = num2[i] - num1[i] - borrow; if (res[i] < 0 && i + 1 < len) { borrow = 1; res[i] += 10; } else borrow = 0; } } while (res[len - 1] == 0 && len > 1) len--; printf("The result is : n"); printf("%s - %s = ", str1, str2); if (!flag) printf("-"); for (int i = len - 1; i >= 0; i--) printf("%d", res[i]); printf("n"); }



