• 締切済み

C言語プログラミングで因数分解

たとえばp、qを入力して、 うまく、p=a+b q = a*bとなるa,bが見つかったときにだけ g(x)= x^2 + px + q = (x+a)(x+b) となるようなプログラムを作りたいのですが、どうしたらいいのでしょうか? あと、たとえば、 x+a という式に a=-4 を代入すると、x + -4 と表示されます。 これは地道に、ifで場合わけしてaがマイナスの時には-aを出力する ’というようなことをしなければならないのでしょうか?

みんなの回答

  • yaggy
  • ベストアンサー率33% (4/12)
回答No.1

数学的には(おおざっぱな言い方をすると)2次方程式の解の公式から a=-(-p+√(p^2-4q))/2、b=-(-p-√(p^2-4q))/2 で計算すれば問題ありません。 しかし現実問題として、a、bが虚数になる場合(p^2-4q<0)はC言語ではエラーとなるので分岐する必要があります。また、必ずしも整数解が得られるとは限りません(係数p、qが整数だったとしても)。「うまく見つかる」が「うまく整数解が見つかる」という意味であるのでこれを判別してやる必要があります。 一番単純なのは計算して求めた実数a、bが整数である(この場合はa、bは必ず整数になるはずですが、一般には丸め誤差の都合上必ずしも整数にならない(ex. 0.999998)こともあります)ことを判定する、というのがいいと思います。 全く別の考え方としては、qを素因数分解して2数の積にします(ex. 15=1*15、3*5、(-1)*(-15)、(-3)*(-15))。これらを足してpになるものを抜き出す、というアルゴリズムも考えられます。 x + -4の現象についてはどうしても条件分岐が必要になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語 プログラミング

    以下のプログラムで分からないところがあります。 数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号) 答えを表示するというプログラムなのですが、 5行目と9行目にある”-'0'”の意味が分からないので教えてください。 01: int x=0,y=0,z,i;char a[30],p; 02: printf("式を入力してください。:);gets(a); 03: for(i=0;a[i];i++) 04:  if('0'<=a[i] && a[i]<='9') 05:   x=10*x+a[i]-'0'; 06:  else{p=a[i]-'0';break;} 07: for(i++;a[i];i++) 08:  if('0'<=a[i] && a[i]<='9') 09:   y=10*y+a[i]-'0'; 010: switch(p){ 11:  case '+':z=x+y;break; 12:  case '-':z=x+y;break; 13:  case '*':z=x*y;break; 14:  case '/':z=x/y;break; 15:  default:puts("入力エラーです。");return 0; 16: } 17: printf("%d%c%d=%d\n",x,p,y,z); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

  • C言語 

    C言語でAとBがじゃんけんをして勝ち負けを出力するプログラムをつくりたいのですが、間違いを教えてください。(AがgでBがcならAの勝ち。AがgでBがpならBの勝ち。AがgでBがgなら引き分け。) #include<stdio.h> #include<conio.h> void main() { int A,B; printf("文字を入力せよ"); scanf("%d",&A); scanf("%d",&B); if(A=='g'||B=='c') { printf("Aの勝ち"); } if(A=='g'||B=='p') { printf("Bの勝ち"); } if(A=='g'||B=='g') { printf("引き分け"); } getch(); }

  • C言語の問題です

    二つの仮分数の加算を行うプログラミングである。 x/w+z/y=(xy+wz)/(wy) 1. w,x,y,zは正の整数である。 2.上式のように計算した後、約分して結果を求める。約分には最大公約数を使う。最大公約数の計算は関数gcd(a,b)で以下のアルゴリズム(ユークリッド互除法)で行う。 (1) a,bの大きいほうをp,小さいほうをqとする。 (2) pをqで割った余りをrとする。r=0ならqが解。 r≠0なら、q=r、r=qとして(2)に戻る。 3.計算結果が仮分数ならば、帯分数にして出力する。 次のプログラムの空欄((1)から(3):を埋め、完成させて下さい。 #include <stdio.h> int gcd(int a, int b) { int p,q,r; if(a<b) { q=a; p=b; }else{ q=b; p=a; } while(q>0){ (1); p=q; q=r; } (2); } main(){ int g,k,m,n,p,q,w,x,y,z; printf("x/w + z/yの数値を入力して下さい(x w z y)"); scanf("%d %d %d %d, &x,&w,&z,&y"); m= w*y; n=x*y+w*z; p=m; q=n; g=gcd(p,q); m=m/g; n=n/g; if((3)) { k = n/m; n = n - k*m; if(n==0) printf("%d\n",k); else printf("%d %d/%d\n",k,n,m); } else printf("%d/%d\n",n,m); } 全く見当がつきません。どなたかお助け下さい。回答を教えてください。

  • 因数分解のプログラム

    皆さんごきげんよう。  3次式の因数分解をするプログラムを作っているのですが、3重解のときの求め方で困っています。 具体的には、 for(x=-100; x<101; x++){ if(a*x*x*x+b*x*x+c*x+d == 0){ printf("%d",x); } } このようにして、与式が0になるときにその値を出力しようと思うのですが、このやり方では、例えば(x-1)^3で、答えが"1"一つだけになってしまいます。この答えを、"1","1","1"としたいのです。  よろしくお願いします。

  • 因数分解プログラム(C言語)について(1)

    ”因数分解を行うプログラムについて”の質問と同じ者です。 みなさんのご回答を参考にして、作ってみたのですが、 ポインタとかの使い方などがわからず、実行すると、 不正な処理を行ったので終了しますとなってしまいます。 どなたか、具体的にどこが悪いのか、 そしてどのように直せば正しく実行されるのか、 教えて下さい。お願いします。 以下↓がプログラムです。 800文字以上のため二つに分割しました。 #include <stdio.h> #include <math.h> #include <process.h> /*関数プロトタイプ宣言*/ int input(int *,int *,int *); int judge(int *,int *,int *); int bunkai1(int *,int *,int *,int *,int *,float *); int bunkai2(int *,int *,int *,int *,int *,float *); int yakubun1(int *,int *,int *,int *,int *,int *,int *); int yakubun2(int *,int *,int *,int *,int *,int *,int *); int output(int *,int *,int *,int *); /*関数の呼び出し*/ int main(void) { int a,b,c,q,n1,m1,min1,flag,i,d,e,m2,n2,min2,f,g; float D; input(&a,&b,&c); judge(&a,&b,&c); bunkai1(&a,&b,&q,&n1,&m1,&D); bunkai2(&a,&b,&q,&n2,&m2,&D); yakubun1(&m1,&n1,&min1,&flag,&i,&d,&e); yakubun2(&m2,&n2,&min2,&flag,&i,&f,&g); output(&d,&e,&f,&g); return (0); } /*数値入力関数*/ int input(int *a,int *b,int *c) { printf("a*x^2+b*x+c=0で,a,b,cを入力して下さい。\n"); printf("a="); scanf("%d",a); printf("b="); scanf("%d",b); printf("c="); scanf("%d",c); if(*a == 0){ printf("a = 0なので因数分解できません。\n"); exit(1); } return 0; } つづく

  • 因数分解

    【質問】なぜ、+-1/2 か +-5/2 を代入してみるのですか。 (例題) P(x)=2x^3-3x^2-x-10 を因数分解してください。 解: P(5/2)=2×(5/2)^3-3×(5/2)^2-5/2-10 ※+-1/2 か +-5/2 を代入してみる     =0 上記式を2x-5で割り算して、 ゆえに P(x)=(2x-5)(x^2+x+2) よろしくお願いしますm(--)m

  • C言語プログラミングで困っています。助けて下さい。

    C言語プログラミングで困っています。助けて下さい。 課題1-1: 実数 a と実数 b を入力すると、一次方程式ax + b = 0 の解を求めるプログラムを作る 課題1-2: 1-1 で作成したプログラムについて、さらにa として1が入力されたとき、方程式の表示       部分が1x + 3 = 0ではなくx + 3 = 0となるようにせよ 課題1-3: 1-2 で作成したプログラムについて、さらにb として0 や負の数が入力されたとき、方程式     の表示部分が2x = 0 や2x – 3 = 0となるようにせよ 課題1-4: 1-3 で作ったプログラムについて、さらにa の値として0が入力された場合、「解けません」     と表示するようにせよ 課題1-5: 係数 a, b, c を入力すると、 2次方程式ax2 + bx + c =0の解を表示するプログラムを作     れ ※ 1-2 ~ 1-4 のような機能を盛り込む ※ a が0の場合には、先に作った1次方程式のプログラムが動く という問題です。最終的にこれらを一つのプログラムにしてください。判別式や解の公式、ルート√などを使ってよろしくお願いします。C言語でお願いします

  • c言語です。

    c言語です。 実行結果 式 3 X1 + 2 X2 + 1 X3 = &g 2 X1 + 5 X2 + 2 X3 = &g 1 X1 + 4 X2 + 1 X3 = &g 解 X1 = 1 X2 = 2 X3 = 3 を 式 3 X1 + 2 X2 + 1 X3 = 10 2 X1 + 5 X2 + 2 X3 = 18 1 X1 + 4 X2 + 1 X3 = 12 解 X1 = 1 X2 = 2 X3 = 3 に直したいのですが&gの所をどのようにしたら10.18.12になりますか? #include <stdio.h> #include <float.h> #define N 3 double A[N][N] = {{3,2,1}, {2,5,2}, {1,4,1}}; double b[N] = { 10, 18, 12 }; void Gauss_J( int, double*, double* ); void main(void) { int i; printf( "%d式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g X1 + %g X2 + %g X3 = &g \n", A[i][0], A[i][1], A[i][2], b[i] ); } printf("解\n"); Gauss_J(N, (double *)A, (double *)b ); printf("X1 = %g \n", b[0]); printf("X2 = %g \n", b[1]); printf("X3 = %g \n", b[2]); } void Gauss_J(int n, double *a, double *b) { int p, i, j,I ; double pivot, c ; for ( p = 0 ; p < n ; p++ ) { pivot = a[ p*n + p ]; for ( i = p ; i < n ; i++ ) { a[ p*n + i ] /= pivot; } b[ p ] /= pivot; for ( I = 0 ; I < n ; I++) { if (I != p) { c = a[ I*n + p]; for ( j = p ; j < n; j++ ) { a[ I*n + j] -= c * a[ p*n + j ]; } b[ I ] -= c * b[ p ]; } } } return ; }

  • C言語プログラミングで、多項式の展開をする

    プログラミングの初心者です。 emacsを使って次のようなプログラムを作りたいのですがよくわかりません。 たとえば、a=2 b=3 を入力すると、 f(X)=(x+a)(x+b)=x^2+5x+6 と出力されるようなものです。 いろいろやってみてはいるのですが、「xの変数の型が宣言されていません」などと、(やってるつもりなんだけど)表示されたりしてうまくいきません。どなたか助けてください。

  • 因数定理。後少しなんですが…

    いつもお世話になっています。 あと1週間で実力テストとなり勉強に追われているものです…;; 因数定理を使う問題で、 整式P(x)を(x+1)(x-2)で割ったときの余りは5x+7である。このときP(x)をx+1で割ったときの余りを求めよ。という問題なんですが・・・ まず、因数定理でP(x)=(x+1)(x-2)Q(x)+5x+7 P(-1)=2 P(2)=17 が分かり 次に、余りをax+bとおいて、P(x)=(x+1)Q(x)+ax+bとし、 この式に-1を代入し-a+b=2 という所まではいけたのですが…もうひとつ式が出ない限りaとbの値は出せないので困っています;;

専門家に質問してみよう