読者です 読者をやめる 読者になる 読者になる

出来るだけ寝ていたい

1日最低12時間睡眠、寝たら負け

課題3 チャレンジ

これはみんな出来たんじゃない?やるだけ問題な気がする。まあ、ちょこちょこ穴があるけど。そんな事はその都度考えれば良い訳で。。
で、出来上がったコードはこんなん。

package kadai1.prog1.main;
import java.util.Scanner;
public class Prog002 {
            //----------------------------------------------------------------------------------//
            /*static double newton(int n,double a,double b,double c,double e){
                        if(Math.abs(a*newton(n,a,b,c,e)*newton(n,a,b,c,e)+b*newton(n,a,b,c,e)+c)<=e){
                                    return newton(n,a,b,c,e);
                        }
                        //初期値の設定//
                        if(n==0){
                                    return (newton(n+1,a,b,c,e)+(a*5*5+b*5+c)/(2*a*5+b));
                        }
                        //再帰//
                        return (newton(n+1,a,b,c,e)+(a*newton(n,a,b,c,e)*newton(n,a,b,c,e)+b*newton(n,a,b,c,e)+c)/(2*a*newton(n,a,b,c,e)+b));
            }*/
//-----------------------------------------main--------------------------------------//
            public static void main(String[] args){
                        Scanner stdIn= new Scanner(System.in);
                        System.out.println("二次方程式ax^x+bx+c=0の各係数を入力してください。(制約 b*b-4*a*c>0)");
                        System.out.print("a:");
                        double a=stdIn.nextDouble();
                        System.out.print("b:");
                        double b=stdIn.nextDouble();
                        System.out.print("c:");
                        double c=stdIn.nextDouble();
                        System.out.println("次に誤差の範囲eを入力してください。");
                        System.out.print("e:");
                        double e=stdIn.nextDouble();
                        double x1=b/2*a+5,x2;
                        while(true){
                                    if(Math.abs(a*x1*x1+b*x1+c)<= e){
                                                System.out.println("二次方程式"+a+"*x*x+"+b+"*x+"+c+"=0の解は"+x1+"です。");
                                                break;
                                    }
                                    if((b*b-4*a*c)<=0){
                                                System.out.println("エラー");
                                                break;
                                    }
                                    x2=(x1-((a*x1*x1+b*x1+c)/(2*a*x1+b)));
                                    x1=x2;
                        }
                        double x3=b/2*a-5,x4;
                        while(true){
                                    if(Math.abs(a*x3*x3+b*x3+c)<=e ){
                                                System.out.println("また、もう一つの解は"+x3+"です。");
                                                break;
                                    }
                                    if((b*b-4*a*c)<=0){
                                                break;
                                    }
                                    x4=(x3-((a*x3*x3+b*x3+c)/(2*a*x3+b)));
                                    x3=x4;
                        }
            }
}

上の方で再帰使った関数を作ったんだけどスタックオーバーフローしたから諦めた時の残骸。探索が深すぎるとメモリが足りなくなってエラーを起こす事なのだけれど、特にjavaは起こりやすいみたいだからあまりガッツリ再帰を使う事は無さそう。その代わりにdpとかでやるしか無いね。後は2つの解を求めるために初期値を軸の左右で分けるなんて事を書いたけど、これは友達のやり方をパクっただけです。僕は最初long型の一番大きい数値と小さい数値を初期値に入れれば理論上求まるからといって莫大な数値を初期値にしたのを覚えてます。でも、それにも欠陥があって本当はdouble型じゃないと正確な解は求まらないよね…。と、こんな感じでした。