5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cで因数分解を実装する

Last updated at Posted at 2017-09-12

#Cで因数分解を実装する
中学数学網羅第三弾です。相当前に作ったプログラムですので今回はあんまり自信がないです自分のメモ程度であとはフィードバックがもらえたらいいと思います

まあザッカーバーグの名言で
「とりあえずリリースしようぜ!」っていうのがありますからねw

##中学因数分解の説明
高校数学でも因数分解があると聞いたので中学因数分解の説明をやっていきたいと思います。

そもそも因数分解とは
因数...掛け算
分解...分ける

つまり掛け算の形に変形する
ということですが公式を利用する問題と利用しない公式があるのですが

今回は公式を利用する形で
4つの公式があると習いました(今回は使わないですが)



x^2 + (a + b)x + ab = (x + a)(x + b)...①
\\
x^2 + 2ax + a^2 = (x + a)^2...②
\\
x^2 + 2ax - a^2 = (x - a)^2 ...③
\\
x^2 - a^2 = (x + a)(x - a)...④


これが公式なのですが全て①の公式に当てはめることができます
なので①の公式を使えば公式を利用する因数分解はできるということです

#早速コーディング

数式を



x^2 + ax + b


と定義して変数を宣言します

main.c

    int a = 0; //aの部分
    int b = 0; //bの部分
    int i = 0; //ループ文のカウンタ
    int j = 0; //ループ文の中に入れるループ文のカウンタ

今回はdoubleを使わなくてもいいのかななんて思ってました。

printfで入力を促します

main.c

    printf("x^2+ax+bのaとbの部分を入力してください\n"); //入力を促します
    
    printf("a = "); //aの入力を促す
    
    scanf("%d", &a); //aを読み込む
    
    printf("b = "); //bの入力を促す
    
    scanf("%d", &b); //bを読み込む

##本格的な計算
if文で-と条件分けしてループ文で一つずつ当てはめて数字を絞り出して最後に残った数字を出力するシステムにしたのですがこれだと-がつくときにかなりの処理時間を用いてしまうのですが答えが出ればいいかなと思いました。

main.c

//aとbがどちらも正の数だった時の計算
    if (a > 0 && b > 0) {
        //jとiを九九のように一つずつ上げていく
        for (i = 1; i <= b; i++) {
            for (j = 1; j <= b; j++) {
                //jとiの積がbと一致するかどうかのif文
                if (i * j == b) {
                    //さらにjとiの和がaかどうかのif文
                    if (j + i == a) {
                        a = i;
                        //出力
                        printf("(x+%d)(x+%d)" , j, i);
                        //ブレイク
                        break;
                    }
                }
            }
    }
    
    }
    //aとbのどちらかが負の数だった時の計算
    if (a < 0 || b < 0) {
        for (i = -1; i <= b; i--) {
            for (j = -1; j <= b; j--) {
                if (i * j == b) {
                    if (j + i == a) {
                        a = i;
                        printf("(x%d)(x%d)" , j, i);
                        break;
                    }
                }
            }
        }
    }

つまりiが1の時jを1〜bまでかけていくということをしています

#ソースコード
今回はあっているかどうかわからないですが答えはでます

main.c

#include <stdio.h>

int main() {
    // insert code here...
    
    int a = 0; //aの部分
    int b = 0; //bの部分
    int i = 0; //ループ文のカウンタ
    int j = 0; //ループ文の中に入れるループ文のカウンタ
    
    printf("x^2+ax+bのaとbの部分を入力してください\n"); //入力を促します
    
    printf("a = "); //aの入力を促す
    
    scanf("%d", &a); //aを読み込む
    
    printf("b = "); //bの入力を促す
    
    scanf("%d", &b); //bを読み込む
    
    //aとbがどちらも正の数だった時の計算
    if (a > 0 && b > 0) {
        //jとiを九九のように一つずつ上げていく
        for (i = 1; i <= b; i++) {
            for (j = 1; j <= b; j++) {
                //jとiの積がbと一致するかどうかのif文
                if (i * j == b) {
                    //さらにjとiの和がaかどうかのif文
                    if (j + i == a) {
                        a = i;
                        //出力
                        printf("(x+%d)(x+%d)" , j, i);
                        //ブレイク
                        break;
                    }
                }
            }
    }
    
    }
    //aとbのどちらかが負の数だった時の計算
    if (a < 0 || b < 0) {
        for (i = -1; i <= b; i--) {
            for (j = -1; j <= b; j--) {
                if (i * j == b) {
                    if (j + i == a) {
                        a = i;
                        printf("(x%d)(x%d)" , j, i);
                        break;
                    }
                }
            }
        }
    }
    
    
    
}

ありがとうございました。

5
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?