#author("2018-08-18T11:30:44+09:00","default:togami","togami") #author("2018-08-18T11:33:18+09:00","default:togami","togami") [[C言語で解く数学入門]] * 2次方程式の解を求める [#p264b28d] #code(c++){{ #include <stdio.h> #include <stdlib.h> /* a,bの最大公約数を返す */ int gcd(int a, int b) { int next_a, next_b; while(b > 0) { next_a = b; next_b = a % b; a = next_a; b = next_b; } int next_a, next_b; while(b > 0) { next_a = b; next_b = a % b; a = next_a; b = next_b; } return a; return a; } /* a/b を既約分数として出力する(改行なし) */ void printfrac(int a, int b) { int g = gcd(abs(a), abs(b)); if(a % b == 0) { printf("%d", a/b); } else { printf("%d/%d", a/g, b/g); } int g = gcd(abs(a), abs(b)); if(a % b == 0) { printf("%d", a/b); } else { printf("%d/%d", a/g, b/g); } } int main(void) { int a, b, c; scanf("%d%d%d", &a, &b, &c); int a, b, c; scanf("%d%d%d", &a, &b, &c); /* a > 0 となるようにする */ if(a < 0) { a *= -1; b *= -1; c *= -1; } /* 判別式が0以下の場合は別処理 */ int D = b*b - 4*a*c; if(D < 0) { printf("nothing\n"); return 0; } if(D == 0) { printf("x = "); printfrac(-b, 2*a); printf("\n"); return 0; } /* a > 0 となるようにする */ if(a < 0) { a *= -1; b *= -1; c *= -1; } /* 判別式が0以下の場合は別処理 */ int D = b*b - 4*a*c; if(D < 0) { printf("nothing\n"); return 0; } if(D == 0) { printf("x = "); printfrac(-b, 2*a); printf("\n"); return 0; } /* D = d2_/d1 とし,d1, d2 を求める */ int n, m, i; int d1 = 1; int d2 = D; for(i = 2; i*i <= d2; i++) { while(d2 % (i*i) == 0){ d2 = d2 / (i*i); d1 = d1 * i; } } /* D = d2_/d1 とし,d1, d2 を求める */ int n, m, i; int d1 = 1; int d2 = D; for(i = 2; i*i <= d2; i++) { while(d2 % (i*i) == 0){ d2 = d2 / (i*i); d1 = d1 * i; } } /* d2 = 1 のとき,解は有理数となる */ if(d2 == 1) { printf("x = "); printfrac(-b + d1, 2*a); printf(", "); printfrac(-b - d1, 2*a); printf("\n"); return 0; } /* d2 = 1 のとき,解は有理数となる */ if(d2 == 1) { printf("x = "); printfrac(-b + d1, 2*a); printf(", "); printfrac(-b - d1, 2*a); printf("\n"); return 0; } /* b,d1,2a の最大公約数を g とする */ int g = gcd(abs(b), gcd(abs(d1), abs(2*a))); if(2*a/g == 1) { if(d1/g == 1) { printf("x = %d +/- _/%d\n", -b/g, d2); } else { printf("x = %d +/- %d_/%d\n", -b/g, d1/g, d2); } } else { if(d1/g == 1) { printf("x = (%d +/- _/%d) / %d\n", -b/g, d2, 2*a/g); } else { printf("x = (%d +/- %d_/%d) / %d\n", -b/g, d1/g, d2, 2*a/g); } } return 0; /* b d1,2a の最大公約数を g とする */ int g = gcd(abs(b), gcd(abs(d1), abs(2*a))); if(2*a/g == 1) { if(d1/g == 1) { printf("x = %d +/- _/%d\n", -b/g, d2); } else { printf("x = %d +/- %d_/%d\n", -b/g, d1/g, d2); } } else { if(d1/g == 1) { printf("x = (%d +/- _/%d) / %d\n", -b/g, d2, 2*a/g); } else { printf("x = (%d +/- %d_/%d) / %d\n", -b/g, d1/g, d2, 2*a/g); } } return 0; } }}