Data_Structure/作業/unit2/poly-integer-root.c

321 lines
7.9 KiB
C
Raw Normal View History

2025-01-20 21:30:53 +08:00
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define MAX 10
// <20>x<EFBFBD>s<EFBFBD>C<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>c
struct Term {
int coefficient; // <20>Y<EFBFBD><59>
int exponent; // <20><><EFBFBD><EFBFBD>
};
//<2F>p<EFBFBD><70><EFBFBD>i<EFBFBD><EFBFBD><E0AABA>
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]%arrR[i])==0){
ans[k++] = arrL[j]/arrR[i];
}
}
}*len_ans =k;
}
//<2F>N<EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD>Y<EFBFBD>ƻP<C6BB>`<60>ƪ<EFBFBD><C6AA>]<5D>ƥ[<5B>J<EFBFBD>t<EFBFBD><74>
void plus_root_negative(int arr[],int *len){
int i , j=0;
for(i=0;i<*len;i++){
arr[*len+j]=-(arr[i]);
j++;
}*len=*len+j;
}
//<2F><><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD>Y<EFBFBD>ƻP<C6BB>`<60>ƪ<EFBFBD><C6AA>]<5D><>
void find_factor(int P[], int facF[], int facL[], int len, int *count1, int *count2) {
int i, j = 0;
for (i = 1; i <= abs(ceil(P[2] / 2)); i++) {
if (abs(P[2]) % i == 0) {
facF[j++] = i;
}
}
facF[j++] = fabs(P[2]); // <20>]<5D>t P[2] <20><><EFBFBD><EFBFBD>
*count1 = j; // <20>]<5D>w<EFBFBD><77><EFBFBD><EFBFBD>]<5D>ƭӼ<C6AD>
j = 0;
for (i = 1 ; i <= abs(ceil(P[len-1] / 2)); i++) {
if (abs(P[len-1]) % i == 0) {
facL[j++] = i;
}
}
facL[j++] = fabs(P[len-1]); // <20>]<5D>t P[len] <20><><EFBFBD><EFBFBD>
*count2 = j; // <20>]<5D>w<EFBFBD><77><EFBFBD><EFBFBD>]<5D>ƭӼ<C6AD>
}
//<2F><><EFBFBD>ڥN<DAA5>J<EFBFBD><4A><EFBFBD>{<7B><>
int evaluate_polynomial(int A[], int len, int x) {
int result = 0;
int i;
for (i = 2; i < len; i += 2) {
result += A[i] * pow(x, A[i-1]);
}
return result;
}
//<2F><><EFBFBD>ڥN<DAA5>J<EFBFBD><4A><EFBFBD>{<7B><> <20>D<EFBFBD><44><EFBFBD><EFBFBD>
void Substitute(int len_root, int arr[], int ans[], int A[], int len_A, int *len_ans) {
int i, j = 0, result;
for (i = 0; i < len_root; i++) {
result = evaluate_polynomial(A, len_A, arr[i]);
// printf("x = %d, result = %d\n", arr[i], result);
if (result == 0) {
ans[j++] = arr[i];
}
}
*len_ans = j;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD><C6AA><EFBFBD><EFBFBD><EFBFBD>
void remove_duplicates(int A[], int len, int new_A[], int *new_len) {
int i, j, k;
int is_duplicate;
*new_len = 0; // <20><><EFBFBD>l<EFBFBD>Ʒs<C6B7><73><EFBFBD>}<7D>C<EFBFBD><43><EFBFBD>׬<EFBFBD>0
// <20>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>}<7D>C
for (i = 0; i < len; i++) {
is_duplicate = 0; // <20><><EFBFBD>]<5D><><EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>ˬd<CBAC>O<EFBFBD>_<EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD>}<7D>C<EFBFBD><43><EFBFBD>X<EFBFBD>{<7B>L
for (j = 0; j < *new_len; j++) {
if (A[i] == new_A[j]) {
is_duplicate = 1; // <20>p<EFBFBD>G<EFBFBD>o<EFBFBD>{<7B><><EFBFBD>ơA<C6A1>аO<D0B0><4F>1
break;
}
}
// <20>p<EFBFBD>G<EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1>N<EFBFBD><4E><EFBFBD>[<5B>J<EFBFBD><4A><EFBFBD>G<EFBFBD>}<7D>C
if (!is_duplicate) {
new_A[*new_len] = A[i];
(*new_len)++; // <20><><EFBFBD>s<EFBFBD><73><EFBFBD>G<EFBFBD>}<7D>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
}
//<2F><><EFBFBD>ܤ<EFBFBD><DCA4>{<7B><>
void output(int *A,int len){
int i ,j,flag_Max=0,flag_x=0, flag_const=0 ;
printf("\n<EFBFBD><EFBFBD><EFBFBD>{<7B><>p(x)= ");
//A[i]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> A[i+1]<5D><><EFBFBD>Y<EFBFBD><59>
//i<>q1<71>}<7D>l<EFBFBD><6C> <20>@<40><>Ū<EFBFBD><C5AA><EFBFBD>@<40>ӫ<EFBFBD><D3AB>ƻP<C6BB>Y<EFBFBD><59>
//len<65><6E>A[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//flag_Max <20><><EFBFBD>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58>
//flag_x <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58>
//flag_const <20><><EFBFBD>`<60>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>X<EFBFBD><58>
for(i=1;i<len;i++){
if(A[i]==1){ //<2F>Y<EFBFBD><59><EFBFBD>ƶ<EFBFBD>=1 IJ<>o<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58>
flag_x=1;
}else if(A[i]==0){ //<2F>Y<EFBFBD><59><EFBFBD>ƶ<EFBFBD>=0 IJ<>o<EFBFBD>`<60>ƶ<EFBFBD><C6B6>X<EFBFBD><58>
flag_const=1;
}
if(flag_Max==0){ //<2F>Ĥ@<40><>
if( A[i]>1 && A[i+1]!=1){ //<2F><><EFBFBD>Ƥj<C6A4><6A>1 <20>Y<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD>1
printf("%dx^%d",A[i+1],A[i]);
}else if(A[i]>1 && A[i+1]==1){
printf("x^%d",A[i]); //<2F><><EFBFBD>Ƥj<C6A4><6A>1 <20>Y<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>1
}else if(A[i]==1 && A[i+1]!=1){ //<2F><><EFBFBD><EFBFBD>=1 <20>Y<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD>1
printf("%dx",A[i+1]);
}else if(A[i]==0 && A[i+1]!=1){ //<2F><><EFBFBD><EFBFBD>=0 <20>Y<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD>1
printf("%d",A[i+1]);
}else if(A[i]==1 && A[i+1]==1){ //<2F><><EFBFBD><EFBFBD>=1 <20>Y<EFBFBD><59>=1
printf("x");
}else if(A[i]==1 && A[i+1]==-1){ //<2F><><EFBFBD><EFBFBD>=1 <20>Y<EFBFBD><59>=-1
printf("-x");
}flag_Max = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58>=1
}else if(flag_x == 1 && flag_const==0){// x<>@<40><><EFBFBD><EFBFBD>
if(A[i+1]>0){ // x<>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(A[i+1]==1){
printf("+x",A[i+1]);
}else{
printf("+%dx",A[i+1]);
}
}else if(A[i+1]<0){ //x<>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t
if(A[i+1]==-1){
printf("-x",A[i+1]);
}else{
printf("%dx",A[i+1]);
}
}
}else if(flag_const==1){ // <20>`<60>ƶ<EFBFBD>
if(A[i+1]>0){ //<2F>`<60>ƶ<EFBFBD>>0
printf("+%d",A[i+1]);
}else if(A[i+1]<0) { //<2F>`<60>ƶ<EFBFBD><0
printf("%d",A[i+1]);
}
}else if(flag_Max==1 && flag_x==0 && flag_const==0) { //<2F>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(A[i+1]>0){ //<2F>Y<EFBFBD><59>>1
if(A[i+1]==1){ //<2F>Y<EFBFBD><59>=1
printf("x^%d",A[i]);
}else{ //<2F>Y<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD>1
printf("+%dx^%d",A[i+1],A[i]);
}
}else if(A[i+1]<0){ //<2F>Y<EFBFBD><59><1
if(A[i+1]==-1){ //<2F>Y<EFBFBD><59>=-1
printf("-x^%d",A[i]);
}else{ //<2F>Y<EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD>1
printf("%dx^%d",A[i+1],A[i]);
}
}
}i++;
}
printf("\n");
}
int main() {
int i,j, len, countF, countL, len_root, len_ans ,len_new ;
char input[100];
struct Term terms[MAX];
int term_count = 0;
printf("\n*** <20>Ѧh<D1A6><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD> ***\n");
// 1. Ū<><C5AA><EFBFBD><EFBFBD><EFBFBD>J
printf("\n<EFBFBD>п<EFBFBD><EFBFBD>J<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. <20>B<EFBFBD>z<EFBFBD>C<EFBFBD>@<40><>
char *ptr = input;
while (*ptr && term_count < MAX) {
int coef = 0, exp = 0;
int is_negative = 0;
// <20>ˬd<CBAC>t<EFBFBD><74>
if (*ptr == '-') {
is_negative = 1;
ptr++;
} else if (*ptr == '+') {
ptr++;
}
// <20><><EFBFBD>L<EFBFBD>ťզr<D5A6><72>
while (isspace(*ptr)) ptr++;
// 3. <20>ѪR<D1AA>C<EFBFBD>@<40><>
if (sscanf(ptr, "%dx^%d", &coef, &exp) == 2) {
// <20><><EFBFBD>㪺 ax^b <20>Φ<EFBFBD>
ptr = strchr(ptr, '^') + 1;
} else if (sscanf(ptr, "%dx", &coef) == 1) {
// ax <20>Φ<EFBFBD><CEA6>A<EFBFBD><41><EFBFBD>Ƭ<EFBFBD>1
exp = 1;
ptr = strchr(ptr, 'x') + 1;
} else if (sscanf(ptr, "x^%d", &exp) == 1) {
// x^b <20>Φ<EFBFBD><CEA6>A<EFBFBD>Y<EFBFBD>Ƭ<EFBFBD>1
coef = 1;
ptr = strchr(ptr, '^') + 1;
} else if (strncmp(ptr, "x", 1) == 0) {
// <20><><EFBFBD>W<EFBFBD><57> x<>A<EFBFBD>Y<EFBFBD>Ƭ<EFBFBD>1<EFBFBD>A<EFBFBD><41><EFBFBD>Ƭ<EFBFBD>1
coef = 1;
exp = 1;
ptr++;
} else {
// <20><><EFBFBD>]<5D>O<EFBFBD>`<60>ƶ<EFBFBD>
sscanf(ptr, "%d", &coef);
exp = 0;
while (isdigit(*ptr)) ptr++;
}
// 4. <20>B<EFBFBD>z<EFBFBD>t<EFBFBD><74>
if (is_negative) {
coef = -coef;
}
// 5. <20>x<EFBFBD>s<EFBFBD><73><EFBFBD>G
terms[term_count].coefficient = coef;
terms[term_count].exponent = exp;
term_count++;
// <20><><EFBFBD>X<EFBFBD><58><EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><48><EFBFBD>]<5D>Ω<EFBFBD><CEA9>ոա^
// printf("<22><> %d: <20>Y<EFBFBD><59> = %d, <20><><EFBFBD><EFBFBD> = %d\n", term_count, coef, exp);
// <20><><EFBFBD>ʨ<EFBFBD><CAA8>U<EFBFBD>@<40><> '+' <20><> '-' <20>Ÿ<EFBFBD>
while (*ptr && *ptr != '+' && *ptr != '-') ptr++;
}
// int *A = (int*)malloc(((term_count*2)+1) * sizeof(int)) ;
len = ((term_count*2)+1);
int A[len];
// printf("term_count=%d\n",term_count);
// printf("((term_count*2)+1)=%d\n",((term_count*2)+1));
// printf("sizeof(A)=%d\n",sizeof(A));
A[0]=term_count;
for (i = 1 , j=0 ; i < term_count*2 ; i++ , j++ ){
A[i]= terms[j].exponent;
A[i+1]= terms[j].coefficient;
// printf("A[%d]=%d\n",i,terms[j].exponent);
// printf("A[%d]=%d\n",i+1,terms[j].coefficient);
i++;
}
// printf("A[]= ");
// for (i = 0; i < len; i++) {
// printf(" %d ",A[i]);
// }
// printf("\n");
// 1x^3-2x^2-1x^1+2x^0
// 1x^5-1x^3-1x^2-1x^1+1x^0
// 1x^2-100x^0 1x^1+100x^0
// 3x^4+9x^3-198x^2+156x^1+360x^0
int facF[30], facL[30], root[60], ans[60] ,new_ans[8];
find_factor(A, facF, facL, len, &countF, &countL);
// printf("<22>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD>]<5D>Ƭ<EFBFBD>: ");
// for (i = 0; i < countF; i++) {
// printf("%d ", facF[i]);
// }
// printf("\n<>`<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("<22>i<EFBFBD><EFBFBD>ڡG\n");
// for (i = 0; i < len_root; i++) {
// printf("root[%d] = %d\n", i, root[i]);
// }
//<2F><><EFBFBD>X<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD>
output(A,len);
// <20>p<EFBFBD><70><EFBFBD>i<EFBFBD><EFBFBD><E0AABA>
Substitute(len_root, root, ans, A, len, &len_ans);
//<2F><><EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD>
remove_duplicates(ans,len_ans,new_ans,&len_new);
if(len_new==0){
printf("\n<EFBFBD><EFBFBD><EFBFBD>Ʈڤ<EFBFBD><EFBFBD>s<EFBFBD>b");
return 1 ;
}
if(len_new>0){
printf("\n<EFBFBD>ѱo<EFBFBD><EFBFBD><EFBFBD>Ʈڬ<EFBFBD><EFBFBD>G");
for (i = 0; i < len_new; i++) {
if(i<len_new-1) {
printf("%d<>B",new_ans[i]);
}else if(i==len_new-1) {
printf("%d", new_ans[i]);
}
}
}
return 0;
}