#include #include #include #include #define MAX 10 // 儲存每一項的結構 struct Term { int coefficient; // 係數 int exponent; // 指數 }; //計算可能的解 void count_root(int arrR[],int arrL[],int ans[],int countF,int countL ,int *len_ans){ int i , j ,k=0; for(i=0;i1 && A[i+1]==1){ printf("x^%d",A[i]); //指數大於1 係數等於1 }else if(A[i]==1 && A[i+1]!=1){ //指數=1 係數不等於1 printf("%dx",A[i+1]); }else if(A[i]==0 && A[i+1]!=1){ //指數=0 係數不等於1 printf("%d",A[i+1]); }else if(A[i]==1 && A[i+1]==1){ //指數=1 係數=1 printf("x"); }else if(A[i]==1 && A[i+1]==-1){ //指數=1 係數=-1 printf("-x"); }flag_Max = 1; //高次項的旗標=1 }else if(flag_x == 1 && flag_const==0){// x一次項 if(A[i+1]>0){ // x一次項為正 if(A[i+1]==1){ printf("+x",A[i+1]); }else{ printf("+%dx",A[i+1]); } }else if(A[i+1]<0){ //x一次項為負 if(A[i+1]==-1){ printf("-x",A[i+1]); }else{ printf("%dx",A[i+1]); } } }else if(flag_const==1){ // 常數項 if(A[i+1]>0){ //常數項>0 printf("+%d",A[i+1]); }else if(A[i+1]<0) { //常數項<0 printf("%d",A[i+1]); } }else if(flag_Max==1 && flag_x==0 && flag_const==0) { //多項式中間的部分 if(A[i+1]>0){ //係數>1 if(A[i+1]==1){ //係數=1 printf("x^%d",A[i]); }else{ //係數不等於1 printf("+%dx^%d",A[i+1],A[i]); } }else if(A[i+1]<0){ //係數<1 if(A[i+1]==-1){ //係數=-1 printf("-x^%d",A[i]); }else{ //係數不等於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*** 解多項式之整數根 ***\n"); // 1. 讀取輸入 printf("\n請輸入多項式: "); fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = 0; // 移除換行符 // 2. 處理每一項 char *ptr = input; while (*ptr && term_count < MAX) { int coef = 0, exp = 0; int is_negative = 0; // 檢查負號 if (*ptr == '-') { is_negative = 1; ptr++; } else if (*ptr == '+') { ptr++; } // 跳過空白字符 while (isspace(*ptr)) ptr++; // 3. 解析每一項 if (sscanf(ptr, "%dx^%d", &coef, &exp) == 2) { // 完整的 ax^b 形式 ptr = strchr(ptr, '^') + 1; } else if (sscanf(ptr, "%dx", &coef) == 1) { // ax 形式,指數為1 exp = 1; ptr = strchr(ptr, 'x') + 1; } else if (sscanf(ptr, "x^%d", &exp) == 1) { // x^b 形式,係數為1 coef = 1; ptr = strchr(ptr, '^') + 1; } else if (strncmp(ptr, "x", 1) == 0) { // 單獨的 x,係數為1,指數為1 coef = 1; exp = 1; ptr++; } else { // 假設是常數項 sscanf(ptr, "%d", &coef); exp = 0; while (isdigit(*ptr)) ptr++; } // 4. 處理負號 if (is_negative) { coef = -coef; } // 5. 儲存結果 terms[term_count].coefficient = coef; terms[term_count].exponent = exp; term_count++; // 輸出當前項的信息(用於調試) // printf("項 %d: 係數 = %d, 指數 = %d\n", term_count, coef, exp); // 移動到下一個 '+' 或 '-' 符號 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("最高次方項因數為: "); // 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]); // } //輸出多項式 output(A,len); // 計算可能的解 Substitute(len_root, root, ans, A, len, &len_ans); //移除多餘的解 remove_duplicates(ans,len_ans,new_ans,&len_new); if(len_new==0){ printf("\n整數根不存在"); return 1 ; } if(len_new>0){ printf("\n解得整數根為:"); for (i = 0; i < len_new; i++) { if(i