taiPyのお悩み解決ブログ

日々の発見をまとめます!

Javaの解答例:ABC083B - Some Sums , AtCoder Beginners Selection

はじめに

自分用の備忘録。

問題

下記のリンクを参考にしてね

ABC083B - Some Sums , AtCoder Beginners Selection, https://atcoder.jp/contests/abs/tasks/abc083_b

解答例

import java.util.*;

class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int A = sc.nextInt();
        int B = sc.nextInt();



        int ans = 0;
        
        for (int i = 1; i <= N; i++) {
            
            int sum = 0;
            String nowNumString = String.valueOf(i);
            char[] nowChar = nowNumString.toCharArray();

            for (int j = 0; j < nowChar.length; j++) {
                int num = Integer.parseInt(String.valueOf(nowChar[j]));
                sum += num;
            }

            if (sum >= A && sum <= B) {
                ans = ans + i;
            }            
        }

        System.out.println(ans);

    }
}

ポイント解説

基本的にcharをintに変換するには次のコードを使う。まあ、状況に合わせて、変更する形だが。下記のコードの意味だがまずはCharをStringに変え、そして、そのStringをintに変えるという意味da!

int n = Integer.parseInt(String.valueOf(ch));

意外とこのコードも頻出なので、覚えておきたい。これはstringをcharの配列に格納する感じ。010という数字が与えられて、その中の1は何個ありますか?みたいな問題の時によく使われるよ!数字を分けたい、それぞれのけたを足し合わせたい、みたいなときに使うねー。

char[] nowChar = nowNumString.toCharArray();

その他の解答例

その1

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // N, A, Bを読み込む
    int N = sc.nextInt();
    int A = sc.nextInt();
    int B = sc.nextInt();

    // 総和を保存する変数を定義する
    int sum = 0;

    // 1からNまでの整数でループする
    for (int i = 1; i <= N; i++) {
      // 各桁の和を求める
      int digitSum = 0;
      for (int j = i; j > 0; j /= 10) {
        digitSum += j % 10;
      }

      // 各桁の和がA以上B以下である場合、sumに加算する
      if (A <= digitSum && digitSum <= B) {
        sum += i;
      }
    }

    // 結果を出力する
    System.out.println(sum);
  }
}

引用元

AtCoder Beginners Selectionの実施記録(Java) #AtCoder - Qiita

これはこれでまた全然違う。。なるほど、これは10で割ることで、桁ごとに分けているんですね。確かにこの方法ありですね。。こっちの方法でも実装できるようにしたいな!

解答例 3

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int A = sc.nextInt();
        int B = sc.nextInt();

        int[] listN = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            listN[i] = i;
        }

        int ans = 0;

        for (int i = 1; i <= N; i++) {
            int temp = listN[i];
            int digitSum = 0;
            while (temp > 0) {
                digitSum = digitSum + temp % 10;
                temp = temp / 10;
            }

            if (digitSum >= A && digitSum <= B) {
                ans += listN[i];
            }
        }

        System.out.println(ans);
        

    }

}

Nまでの整数が含まれる配列を作ってしまい、その配列の要素それぞれがA以上B以下であれば、その配列の要素をアンサーに出していくという方法をとった!解答例2の亜種。

ではまた。

参考文献