c语言实现
时间: 2023-07-13 10:13:28 浏览: 37
好的,下面是使用C语言实现的代码,实现两个长整数的除法和求余操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1000
void strrev(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 divmod(char *a, char *b, char *q, char *r) {
int n = strlen(a);
int m = strlen(b);
char *A = (char*) malloc(sizeof(char) * (n + 1));
char *B = (char*) malloc(sizeof(char) * (m + 1));
strcpy(A, a);
strcpy(B, b);
strrev(A);
strrev(B);
int *x = (int*) malloc(sizeof(int) * (n + 1));
int *y = (int*) malloc(sizeof(int) * (m + 1));
for (int i = 0; i < n; i++) {
x[i] = A[i] - '0';
}
for (int i = 0; i < m; i++) {
y[i] = B[i] - '0';
}
int *q1 = (int*) malloc(sizeof(int) * (n + 1));
int *r1 = (int*) malloc(sizeof(int) * (n + 1));
memset(q1, 0, sizeof(int) * (n + 1));
memset(r1, 0, sizeof(int) * (n + 1));
for (int i = n - 1; i >= 0; i--) {
// shift r one bit to left
for (int j = n - 1; j >= 0; j--) {
r1[j + 1] = r1[j];
}
r1[0] = x[i];
// binary search to find the quotient
int l = 0, r = 9;
while (l < r) {
int mid = (l + r + 1) / 2;
int flag = 1;
for (int j = m - 1; j >= 0; j--) {
int t = y[j] * mid + r1[j];
if (t >= 10) {
flag = 0;
break;
}
}
if (flag) {
l = mid;
} else {
r = mid - 1;
}
}
// subtract y * l from r
for (int j = m - 1; j >= 0; j--) {
int t = y[j] * l;
r1[j] -= t;
r1[j + 1] -= r1[j] < 0;
r1[j] += r1[j] < 0 ? 10 : 0;
}
q1[i] = l;
}
// copy the result to q and r
int i, j;
for (i = n - 1; i >= 0; i--) {
if (q1[i] != 0) break;
}
if (i < 0) {
q[0] = '0';
q[1] = '\0';
} else {
for (j = 0; j <= i; j++) {
q[j] = q1[i - j] + '0';
}
q[j] = '\0';
}
for (i = n - 1; i >= 0; i--) {
if (r1[i] != 0) break;
}
if (i < 0) {
r[0] = '0';
r[1] = '\0';
} else {
for (j = 0; j <= i; j++) {
r[j] = r1[i - j] + '0';
}
r[j] = '\0';
}
free(A);
free(B);
free(x);
free(y);
free(q1);
free(r1);
}
int main() {
char a[MAX_LEN];
char b[MAX_LEN];
char q[MAX_LEN];
char r[MAX_LEN];
printf("Enter the first number: ");
scanf("%s", a);
printf("Enter the second number: ");
scanf("%s", b);
divmod(a, b, q, r);
printf("Quotient: %s\n", q);
printf("Remainder: %s\n", r);
return 0;
}
```
注意,这里使用了高精度计算方法,需要动态分配内存来存储数字的每一位。另外,这里的除法操作是整除,即只保留商的整数部分,并且不进行四舍五入。如果需要实现浮点数除法,还需要进行额外的处理。