YYDD125 2023-12-06 23:33 采纳率: 33.3%
浏览 2

这段代码有问题,除法未实现,负数处理错误,函数丢失


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

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 multiply(char* num1, char* num2, char* result) {
    int len1 = strlen(num1), len2 = strlen(num2);
    char* temp1 = (char*)malloc(len1 + 1);
    char* temp2 = (char*)malloc(len2 + 1);

    strcpy(temp1, num1);
    strcpy(temp2, num2);

    reverse(temp1);
    reverse(temp2);

    int carry = 0;

    for (int i = 0; i < len1 || carry != 0; i++) {
        if (i == 0 && !isdigit(temp1[0])) {
            continue;
        }

        int n1 = i < len1 ? temp1[i] - '0' : 0;
        int n2 = i < len2 ? temp2[i] - '0' : 0;

        int product = n1 * n2 + carry;

        carry = product / 10;
        result[i] = product % 10 + '0';
    }

    result[strlen(result)] = '\0';

    reverse(result);

    free(temp1);
    free(temp2);
}

void add(char* num1, char* num2, char* result) {
    int len1 = strlen(num1), len2 = strlen(num2);
    int max_len = len1 > len2 ? len1 : len2;

    char* temp1 = (char*)malloc(max_len + 1);
    char* temp2 = (char*)malloc(max_len + 1);

    memset(temp1, '0', max_len - len1 + 1);
    memcpy(temp1 + max_len - len1, num1, len1);
    temp1[max_len] = '\0';

    memset(temp2, '0', max_len - len2 + 1);
    memcpy(temp2 + max_len - len2, num2, len2);
    temp2[max_len] = '\0';

    int carry = 0;

    for (int i = 0; i < max_len || carry != 0; i++) {
        int n1 = temp1[i] - '0';
        int n2 = temp2[i] - '0';

        int sum = n1 + n2 + carry;

        carry = sum / 10;
        result[i] = sum % 10 + '0';
    }

    result[strlen(result)] = '\0';

    free(temp1);
    free(temp2);
}

void subtract(char* num1, char* num2, char* result) {
    int len1 = strlen(num1), len2 = strlen(num2);
    int max_len = len1 > len2 ? len1 : len2;

    char* temp1 = (char*)malloc(max_len + 1);
    char* temp2 = (char*)malloc(max_len + 1);

    memset(temp1, '0', max_len - len1 + 1);
    memcpy(temp1 + max_len - len1, num1, len1);
    temp1[max_len] = '\0';

    memset(temp2, '0', max_len - len2 + 1);
    memcpy(temp2 + max_len - len2, num2, len2);
    temp2[max_len] = '\0';

    int borrow = 0;

    for (int i = 0; i < max_len; i++) {
        int n1 = temp1[i] - '0';
        int n2 = temp2[i] - '0';

        int diff = n1 - n2 - borrow;

        borrow = diff < 0;
        result[i] = (diff + 10) % 10 + '0';
    }

    while (result[strlen(result) - 1] == '0') {
        result[strlen(result) - 1] = '\0';
    }

    free(temp1);
    free(temp2);
}

char* precise_calculate(char* num1, char* num2, char op) {
    int dot1 = -1, dot2 = -1;
    int len1 = strlen(num1), len2 = strlen(num2);

    for (int i = 0; i < len1; i++) {
        if (num1[i] == '.') {
            dot1 = i;
            break;
        }
    }

    for (int i = 0; i < len2; i++) {
        if (num2[i] == '.') {
            dot2 = i;
            break;
        }
    }

    char* result = (char*)malloc(len1 + len2 + 5); // 最多需要4位小数

    if (op == '+') {
        add(num1, num2, result);
    } else if (op == '-') {
        subtract(num1, num2, result);
    } else if (op == '*') {
        multiply(num1, num2, result);
    } else if (op == '/') {
        printf("除法未实现\n");
        return NULL;
    } else {
        printf("未知运算符: %c\n", op);
        return NULL;
    }

    int res_len = strlen(result);
    int dot_pos = max(dot1, dot2) + 1;
    int shift = dot_pos - res_len;

    for (int i = 0; i < shift; i++) {
        result[strlen(result)] = '0';
        result[strlen(result) + 1] = '\0';
    }

    if (dot_pos >= 0) {
        memmove(result + dot_pos + 1, result + dot_pos, res_len - dot_pos + 1);
        result[dot_pos] = '.';
    }

    return result;
}

int main() {
    char num1[] = "1.25";
    char num2[] = "1.25";
    char op = '+';

    char* result = precise_calculate(num1, num2, op);

    if (result != NULL) {
        printf("%s\n", result);
        free(result);
    }

    return 0;
}

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-12-06 23:34
    关注

    你这代码应该是ai生成的,有问题你继续问ai吧。ai写的代码错误百出,ai搞不定想起来人类给机器收拾烂摊子?

    评论

报告相同问题?

问题事件

  • 创建了问题 12月6日

悬赏问题

  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置