#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;
}

这段代码有问题,除法未实现,负数处理错误,函数丢失
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- threenewbee 2023-12-06 23:34关注
你这代码应该是ai生成的,有问题你继续问ai吧。ai写的代码错误百出,ai搞不定想起来人类给机器收拾烂摊子?
解决 无用评论 打赏 举报