大数加、减、乘法C语言实现

#include <stdio.h>
#include <string.h>
#define N 1000

char str[N];
int a[N], b[N];
int sum[N], difference[N], product[N];//和、差、积

void Zero(int num[N])
{//将数组清零
    for(int i = 0; i < N; i++) num[i]=0;
}

int GetNum(int num[N], char str[N])
{//从字符串中取得大数,去掉符号并把低位存在前面
    int len = strlen(str);
    int ret = 1;//假设是正数
    int i = 0, j = 0;
    Zero(num);
    if (str[0] == '-') {
        j++;
        ret = -1;
    }
    while (j < len) num[i++] = str[j++] - '0';
    int begin = 0, end = len - 1, tmp;
    if (str[0] == '-') end--;
    while (begin < end) {//把数字转换为低位在前高位在后
        tmp = num[begin];
        num[begin] = num[end];
        num[end] = tmp;
        begin++;
        end--;
    }
    return ret;//返回值是数的正负,负为-1,否则为1
}

int Cmp(int a[N], int b[N])
{//比较a、b的大小,>返回1,<返回-1,=返回0
    for (int i = N - 1; i >= 0; i--) {
        if (a[i] > b[i]) return 1;
        if (a[i] < b[i]) return -1;
    }
    return 0;
}

void Swap(int a[N], int b[N])
{//交换a、b的值
    int tmp;
    for (int i = 0; i < N; i++) {
        tmp = a[i];
        a[i] = b[i];
        b[i] = tmp;
    }
}

void Add(int sum[N], int a[N], int b[N])
{//求两个正数之和
    Zero(sum);
    for (int i = 0; i < N - 1; i++) {
        sum[i] += a[i] + b[i];
        if (sum[i] >= 10) {
            sum[i + 1] += sum[i] / 10;
            sum[i] = sum[i] % 10;
        }
    }
}

void Subtract(int difference[N], int a[N], int b[N])
{//求两个正数差的绝对值
    Zero(difference);
    if (Cmp(a, b) == -1) Swap(a, b);
    for (int i = 0; i < N; i++) {
        difference[i] = a[i] - b[i];
    }
    for (int i = 0; i < N - 1; i++) {//从低到高借位
        while (difference[i] < 0) {
            difference[i] += 10;
            difference[i + 1]--;
        }
    }
}

void Multi(int product[N], int a[N], int b[N])
{//求两个正数的积
    Zero(product);
    if (Cmp(a, b) == -1) Swap(a, b);
    //不知道尽量让b小能不能提高效率?
    int hb = N - 1, ha = N - 1;
    while (b[hb] == 0) hb--;//找到b的最高位
    while (a[ha] == 0) ha--;//找到a的最高位
    for (int i = 0; i <= hb; i++) {
        for (int j = 0; j <= ha && i + j < N; j++) {
            product[i + j] += b[i] * a[j];
        }
    }
    for (int i = 0; i < N - 1; i++) {//处理进位
        if (product[i] >= 10) {
            product[i + 1] += product[i] / 10;
            product[i] = product[i] % 10;
        }
    }
}

void Output(int num[N])
{//输出一个数
    int high = N - 1;
    while (num[high] == 0 && high > 0) high--;//找到最高位
    for (int i = high; i >= 0; i--) {
        printf("%d", num[i]);
    }
    printf("\n");
}

int main()
{
    int ta, tb, t;//a的符号、b的符号、得数的符号
    while (scanf("%s", str) != EOF) {
        ta = GetNum(a, str);
        scanf("%s", str);
        tb = GetNum(b, str);
        //加法
        if (ta == tb) {//同为正或同为负
            Add(sum, a, b);
            if (ta == -1) printf("-");//可能需要输出个负号
            Output(sum);
        } else {//不同号,那加法实际上就是算减法
            if(ta == 1) {//如果a正b负
                if (Cmp(a, b) == -1) t = -1;
                else t = 1;
            } else {//如果a负b正
                if (Cmp(a, b) == 1) t = -1;
                else t = 1;
            }
            Subtract(difference, a, b);
            if (t == -1) printf("-");//可能需要输出个负号
            Output(difference);
        }
        //接下来是减法,其实就是a+(-b),基本照抄前面
        tb = -tb;//b取反号
        if (ta == tb) {//同为正或同为负
            Add(sum, a, b);
            if (ta == -1) printf("-");//可能需要输出个负号
            Output(sum);
        } else {//不同号,那加法实际上就是算减法
            if (ta == 1) {
                if (Cmp(a, b) == -1) t = -1;
                else t = 1;
            } else {//如果a负b正
                if (Cmp(a, b) == 1) t = -1;
                else t = 1;
            }
            Subtract(difference, a, b);
            if (t == -1) printf("-");//可能需要输出个负号
            Output(difference);
        }
        tb = -tb;//把b的符号变回来
        t = ta * tb;
        if (t == -1) printf("-");//可能需要输出个负号
        Multi(product, a, b);
        Output(product);
    }
    return 0;//大功告成
}

参考 https://www.nowcoder.com/profile/539068368/codeBooks

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码:#include <stdio.h>int main() { int a, b; int result; char op; printf("输入第一个数字:"); scanf("%d", &a); printf("输入第二个数字:"); scanf("%d", &b); printf("输入运算符:"); scanf(" %c", &op); switch (op) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': result = a / b; break; default: printf("无效的运算符!\n"); break; } printf("运算结果:%d\n", result); return 0; } ### 回答2: 下面是用C语言实现输入两个大数进行加减乘除运算并输出结果的代码: ```c #include <stdio.h> #include <string.h> #define MAX_LENGTH 100 // 假设大数的最大长度为100 // 大数 char* add(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 : len2; int carry = 0; for (int i = 0; i < len; i++) { int sum = (i < len1 ? num1[len1 - 1 - i] - '0' : 0) + (i < len2 ? num2[len2 - 1 - i] - '0' : 0) + carry; carry = sum / 10; result[MAX_LENGTH - i] = sum % 10 + '0'; } if (carry > 0) { result[MAX_LENGTH - len - 1] = carry + '0'; } return result + (result[0] == '0' ? 1 : 0); } // 大数 char* subtract(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 > len2 ? len1 : len2; int borrow = 0; for (int i = 0; i < len; i++) { int diff = (i < len1 ? num1[len1 - 1 - i] - '0' : 0) - (i < len2 ? num2[len2 - 1 - i] - '0' : 0) - borrow; borrow = diff < 0 ? 1 : 0; result[MAX_LENGTH - i] = diff < 0 ? diff + 10 + '0' : diff + '0'; } return result + (result[0] == '0' ? 1 : 0); } // 大数乘 char* multiply(char* num1, char* num2) { static char result[MAX_LENGTH + MAX_LENGTH]; memset(result, '0', MAX_LENGTH + MAX_LENGTH); int len1 = strlen(num1); int len2 = strlen(num2); for (int i = 0; i < len1; i++) { int carry = 0; for (int j = 0; j < len2; j++) { int product = (num1[len1 - 1 - i] - '0') * (num2[len2 - 1 - j] - '0') + carry + (result[MAX_LENGTH + MAX_LENGTH - 1 - i - j] - '0'); carry = product / 10; result[MAX_LENGTH + MAX_LENGTH - 1 - i - j] = product % 10 + '0'; } if (carry > 0) { result[MAX_LENGTH + MAX_LENGTH - 1 - i - len2] = carry + '0'; } } return result + (result[0] == '0' ? 1 : 0); } // 大数除 char* divide(char* num1, char* num2) { static char result[MAX_LENGTH + 1]; memset(result, '0', MAX_LENGTH + 1); int len1 = strlen(num1); int len2 = strlen(num2); if (len2 == 1 && num2[0] == '0') { return "NaN"; // 除数为0,结果为无穷大 } if (len1 < len2 || (len1 == len2 && strcmp(num1, num2) < 0)) { return "0"; // 被除数小于除数,结果为0 } char temp[MAX_LENGTH + 1]; strcpy(temp, num1); for (int i = len1 - len2; i >= 0; i--) { while (strcmp(temp, num2) >= 0) { strcpy(temp, subtract(temp, num2)); result[i]++; } } return result + (result[0] == '0' ? 1 : 0); } int main() { char num1[MAX_LENGTH]; char num2[MAX_LENGTH]; printf("请输入第一个大数:"); scanf("%s", num1); printf("请输入第二个大数:"); scanf("%s", num2); printf("法结果:%s\n", add(num1, num2)); printf("法结果:%s\n", subtract(num1, num2)); printf("乘法结果:%s\n", multiply(num1, num2)); printf("除法结果:%s\n", divide(num1, num2)); return 0; } ``` 这段代码实现大数法(add)、法(subtract)、乘法(multiply)和除法(divide)运算。用户可以输入两个大数,然后计算并输出它们的、乘、除运算结果。代码使用静态字符数组来保存结果,并返回一个指向结果数组的指针,同时处理结果数组前多余的0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值