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

丸三角四角

IT業界にしがみつく新人SEが立派なプログラマになろうともがく奮闘記

【Java】九九の出力_Ver1

IT Java AOJ アルゴリズム プログラミングコンテスト JUnit

Javaでの九九の出力方法を紹介致します。 

 コードを更新しておりますので、最新バージョンは以下を参照してください。

dadainu.hateblo.jp

以下Ver1のコードです。

import static java.lang.System.out;

public class QQ {

    public static void main(String[] args) {
        new QQ().recursionQQ();
    }

    public void loopQQ() {
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
                out.println(i + "x" + j + "=" + i * j);
            }
        }
    }

    public void recursionQQ() {
        recursionQQ(1);
    }

    public void recursionQQ(int i) {
        if (i > 9)
            return;
        recursionQ(i, 1);
        recursionQQ(++i);
    }

    public void recursionQ(int i, int j) {
        if (j > 9)
            return;
        out.println(i + "x" + j + "=" + i * j);
        recursionQ(i, ++j);
    }
}

for文をネストして行う基本的なやり方と再帰でやる方法の両方記載しています。再帰の方はあまり綺麗なコードではないですが、一応再帰で九九を実現できます。

ネストが深い場合、for文で作るのは綺麗じゃなくバグが出やすいコードになってしまいます。しかし今回のような単純な処理であれば、for文で処理を書く方がコードも短く簡単に書くことができるので、適宜判断する必要があるのかもしれません。

 

以下はテストコードです。

import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import volume0.BaseTest;

public class QQTest extends BaseTest {

    private QQ qq;

    @Before
    public void setUp() throws Exception {
        super.setUp();
        qq = new QQ();
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

    @Test
    public void testLoopQQ0001() {
        try {
            qq.loopQQ();
            String[] outList = outContent.toString().split("\n");
            assertOut(outList, "./outData/volume0_0001/out.txt");
        } catch (Exception e) {
            printErr(e);
        }
    }

    @Test
    public void testRecursionQQ0001() {
        try {
            qq.recursionQQ();
            String[] outList = outContent.toString().split("\n");
            assertOut(outList, "./outData/volume0_0001/out.txt");
        } catch (Exception e) {
            printErr(e);
        }
    }

    @Test
    public void testRecursionQQ0002() {
        try {
            qq.recursionQQ(1);
            String[] outList = outContent.toString().split("\n");
            assertOut(outList, "./outData/volume0_0001/out.txt");
        } catch (Exception e) {
            printErr(e);
        }
    }

    @Test
    public void testRecursionQ0001() {
        try {
            qq.recursionQ(1, 8);
            String[] outList = outContent.toString().split("\n");
            assertEquals("1x8=8", "1x8=8", outList[0]);
            assertEquals("1x9=9", "1x9=9", outList[1]);
        } catch (Exception e) {
            printErr(e);
        }
    }
}

上記ドライバの「out.txt」の中身は、

1x1=1

1x2=2

1x3=3

・・・

9x9=81

となってます。

 

今回の問題は、以下にあります。

九九 | Aizu Online Judge

 

アルゴリスムで困った時は、以下の本を参考にしてます。Javaに置き換えるのが少々難解ですが、、、

 

テストドライバで継承しているクラスは以下の記事に記載しています。参考にしてみてください。

dadainu.hateblo.jp