计算机组成原理作业:
用C语言实现大数的加减法
一、CODE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
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 -> 1\n");
printf("Subtraction -> 2\n");
printf("Exit program -> other\n\n");
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("****************************************************\n\n\n");
}
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 = %d\n", 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");
}
二、测试