写一个能判断除数的字符是不是0,能判断输入的两个数是否是字符0到9的数,能计算大数运算,能计算科学记数法,用加减乘除四则运算的简易计算器的代码。并给一对样例输入和输出
时间: 2023-03-24 13:04:45 浏览: 55
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define MAX_LEN 100
int is_digit(char c) {
return c >= '' && c <= '9';
}
int is_zero(char* s) {
return strlen(s) == 1 && s[] == '';
}
int is_valid_num(char* s) {
int len = strlen(s);
if (len == || len > 1 && s[] == '') {
return ;
}
for (int i = ; i < len; i++) {
if (!is_digit(s[i])) {
return ;
}
}
return 1;
}
int is_valid_sci(char* s) {
int len = strlen(s);
if (len == || len > 1 && s[] == '') {
return ;
}
int e_pos = -1;
for (int i = ; i < len; i++) {
if (s[i] == 'e' || s[i] == 'E') {
e_pos = i;
break;
}
}
if (e_pos == -1) {
return is_valid_num(s);
}
char mantissa[MAX_LEN];
strncpy(mantissa, s, e_pos);
mantissa[e_pos] = '\';
char exponent[MAX_LEN];
strncpy(exponent, s + e_pos + 1, len - e_pos - 1);
exponent[len - e_pos - 1] = '\';
return is_valid_num(mantissa) && is_valid_num(exponent);
}
int is_valid_op(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int is_valid_expr(char* s) {
int len = strlen(s);
if (len == ) {
return ;
}
int num_count = ;
int op_count = ;
for (int i = ; i < len; i++) {
if (is_digit(s[i])) {
num_count++;
} else if (is_valid_op(s[i])) {
op_count++;
} else {
return ;
}
}
return num_count > op_count;
}
char* remove_leading_zeros(char* s) {
int len = strlen(s);
int i = ;
while (i < len - 1 && s[i] == '') {
i++;
}
if (i == ) {
return s;
}
char* new_s = (char*) malloc((len - i + 1) * sizeof(char));
strncpy(new_s, s + i, len - i);
new_s[len - i] = '\';
free(s);
return new_s;
}
char* add(char* a, char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = fmax(len_a, len_b) + 1;
char* c = (char*) malloc((len_c + 1) * sizeof(char));
int carry = ;
int i = len_a - 1;
int j = len_b - 1;
int k = len_c - 1;
while (i >= || j >= ) {
int x = i >= ? a[i] - '' : ;
int y = j >= ? b[j] - '' : ;
int z = x + y + carry;
c[k] = z % 10 + '';
carry = z / 10;
i--;
j--;
k--;
}
if (carry > ) {
c[k] = carry + '';
k--;
}
c[len_c - k - 1] = '\';
return remove_leading_zeros(c);
}
char* subtract(char* a, char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = fmax(len_a, len_b);
char* c = (char*) malloc((len_c + 1) * sizeof(char));
int borrow = ;
int i = len_a - 1;
int j = len_b - 1;
int k = len_c - 1;
while (i >= || j >= ) {
int x = i >= ? a[i] - '' : ;
int y = j >= ? b[j] - '' : ;
int z = x - y - borrow;
if (z < ) {
z += 10;
borrow = 1;
} else {
borrow = ;
}
c[k] = z + '';
i--;
j--;
k--;
}
c[len_c - k - 1] = '\';
return remove_leading_zeros(c);
}
char* multiply(char* a, char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = len_a + len_b;
char* c = (char*) malloc((len_c + 1) * sizeof(char));
memset(c, '', len_c * sizeof(char));
c[len_c] = '\';
for (int i = len_a - 1; i >= ; i--) {
int carry = ;
for (int j = len_b - 1; j >= ; j--) {
int x = a[i] - '';
int y = b[j] - '';
int z = x * y + carry + c[i + j + 1] - '';
c[i + j + 1] = z % 10 + '';
carry = z / 10;
}
c[i] += carry;
}
return remove_leading_zeros(c);
}
char* divide(char* a, char* b) {
int len_a = strlen(a);
int len_b = strlen(b);
if (is_zero(b)) {
return NULL;
}
if (len_a < len_b || len_a == len_b && strcmp(a, b) < ) {
char* q = (char*) malloc(2 * sizeof(char));
q[] = '';
q[1] = '\';
return q;
}
char* q = (char*) malloc((len_a - len_b + 2) * sizeof(char));
memset(q, '', (len_a - len_b + 1) * sizeof(char));
q[len_a - len_b + 1] = '\';
char* r = (char*) malloc((len_b + 1) * sizeof(char));
strncpy(r, a, len_b);
r[len_b] = '\';
for (int i = len_b - 1; i < len_a; i++) {
while (strcmp(r, b) >= ) {
q[i - len_b + 1]++;
char* tmp = subtract(r, b);
free(r);
r = tmp;
}
if (i < len_a - 1) {
char* tmp = multiply(r, "10");
tmp[strlen(tmp)] = a[i + 1];
free(r);
r = tmp;
}
}
free(r);
return remove_leading_zeros(q);
}
int main() {
char op;
char num1[MAX_LEN];
char num2[MAX_LEN];
scanf("%c %s %s", &op, num1, num2);
if (op == '/') {
char* q = divide(num1, num2);
if (q == NULL) {
printf("ERROR\n");
} else {
printf("%s\n", q);
free(q);
}
} else {
char* result;
if (op == '+') {
result = add(num1, num2);
} else if (op == '-') {
result = subtract(num1, num2);
} else if (op == '*') {
result = multiply(num1, num2);
} else {
printf("ERROR\n");
return ;
}
printf("%s\n", result);
free(result);
}
return ;
}
样例输入1:
+ 123 456
样例输出1:
579
样例输入2:
- 123 456
样例输出2:
-333
样例输入3:
* 123 456
样例输出3:
56088
样例输入4:
/ 123 456
样例输出4:
样例输入5:
/ 123
样例输出5:
ERROR