95 lines
2.3 KiB
C
95 lines
2.3 KiB
C
#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) { // 使用小的閾值來處理浮點誤差
|
|
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;
|
|
}
|