#include #include #include 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) { // 使用小的閾值來處理浮點誤差 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("最高次方項因數為: "); for (i = 0; i < countF; i++) { printf("%d ", facF[i]); } printf("\n常數項因數為: "); 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("可能的根:\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("多項式的根:\n"); for (i = 0; i < len_ans; i++) { printf("x = %d\n", ans[i]); } return 0; }