Data_Structure/作業/unit2/claude.c

95 lines
2.3 KiB
C
Raw Permalink Normal View History

2025-01-20 21:30:53 +08:00
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void count_root(int arrR[], int arrL[], int ans[], int countF, int countL, int *len_ans) {
int i, j, k = 0;
for (i = 0; i < countF; i++) {
for (j = 0; j < countL; j++) {
if (arrL[j] != 0 && arrR[i] != 0 && arrL[j] % arrR[i] == 0) {
ans[k++] = arrL[j] / arrR[i];
}
}
}
*len_ans = k;
}
void plus_root_negative(int arr[], int *len) {
int i, new_len = *len * 2;
for (i = 0; i < *len; i++) {
arr[*len + i] = -arr[i];
}
*len = new_len;
}
void find_factor(int num, int fac[], int *count) {
int i, j = 0;
for (i = 1; i <= sqrt(abs(num)); i++) {
if (num % i == 0) {
fac[j++] = i;
if (i != num / i) {
fac[j++] = num / i;
}
}
}
*count = j;
}
double evaluate_polynomial(int A[], int len, double x) {
double result = 0;
int i;
for (i = 0; i < len; i += 2) {
result += A[i] * pow(x, A[i+1]);
}
return result;
}
void Substitute(int len_root, int arr[], int ans[], int A[], int len_A, int *len_ans) {
int i, j = 0;
double result;
for (i = 0; i < len_root; i++) {
result = evaluate_polynomial(A, len_A, arr[i]);
if (fabs(result) < 1e-10) { // <20>ϥΤp<CEA4><70><EFBFBD>H<EFBFBD>ȨӳB<D3B3>z<EFBFBD>B<EFBFBD>I<EFBFBD>~<7E>t
ans[j++] = arr[i];
}
}
*len_ans = j;
}
int main() {
int i, len, countF, countL, len_root = 0, len_ans = 0;
int A[] = { 2, 2, 1, 0, -100}; // x^3 - 2x^2 - x + 2
int facF[100], facL[100], root[200], ans[100];
len = sizeof(A) / sizeof(A[0]);
find_factor(abs(A[0]), facF, &countF);
find_factor(abs(A[len-2]), facL, &countL);
printf("<EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D>Ƭ<EFBFBD>: ");
for (i = 0; i < countF; i++) {
printf("%d ", facF[i]);
}
printf("\n<EFBFBD>`<60>ƶ<EFBFBD><C6B6>]<5D>Ƭ<EFBFBD>: ");
for (i = 0; i < countL; i++) {
printf("%d ", facL[i]);
}
printf("\n");
count_root(facF, facL, root, countF, countL, &len_root);
plus_root_negative(root, &len_root);
printf("<EFBFBD>i<EFBFBD><EFBFBD>ڡG\n");
for (i = 0; i < len_root; i++) {
printf("root[%d] = %d\n", i, root[i]);
}
Substitute(len_root, root, ans, A, len, &len_ans);
printf("<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڡG\n");
for (i = 0; i < len_ans; i++) {
printf("x = %d\n", ans[i]);
}
return 0;
}