horoyoisawaの競技プログラミング日記

horoyoisawaが自分が解いた問題に関して感想を述べるブログ

【C】入力の一行全部を受け取りたい時

f:id:horoyoisawa:20201203091501p:plain
入力の一行全てを受け取りたい時に使えるコード。

char s[100];
scanf("%[^\n]%*c", s);

ただたまに入力が正しく受け取れないことがあるかもしれない。
その時は多分改行を入力として受け取っている可能性がある。
その場合、次のコードを追加すれば大丈夫。

// 改行を受け取る
scanf("\n");

【Java、追加予定】printfで出力フォーマット一覧

f:id:horoyoisawa:20201202125359p:plain
Javaで出力するときにprintlnだけでなくprintfも使える。色々出力フォーマットができるので便利。

文字列のフォーマット

// 右詰15文字分
// output:"    horoyoisawa"
System.out.printf("%15s %n", "horoyoisawa")
// 左詰15文字分
// output:"horoyoisawa    "
System.out.printf("%-15s %n", "horoyoisawa")

数値のフォーマット

// five leading zeros
// output:00001
System.out.printf("%05d", 1)

// Round a number to n decimal places
// output: 0.60
System.out.printf("%.2f", 0.600000)

【Java】入力を受け取るときに間違えたやつ。

f:id:horoyoisawa:20201202125359p:plain
以下のようなコードを書いたとする。

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        String s = scan.nextLine();
        scan.close();

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

入力例は以下。
1
3.14
My name is horoyoisawa.

結果は以下。

String:
Double: 3.14
Int: 1

sの中身が空になる。

結構よくあるやつだ。だから一行加えてみる。

String ss = scan.nextLine(); // 追加
String s = scan.nextLine();

こうすると、

String: My name is horoyoisawa.
Double: 3.14
Int: 1

となり、望んだ結果が得られる。

見ればわかるように、改行を考慮していなかったことで生まれた間違いだ。

今後気をつけたい。

【Java】if文の驚き

f:id:horoyoisawa:20201202125359p:plain
Javaをなぜか書き始めた。

もちろん何も知らないので、if文やfor文から入るのだが、そこでC++では通じるがJavaでは通用しない書き方を見つけたので備忘録用に書き留めておく。(おそらくめちゃくちゃあるある)

// 偶数の場合にeven、奇数の場合にはoddを出力したい。
int n;
if(n % 2) System.out.println("odd");
else System.out.println("even");

これだとincompatible typeとなる。
required: boolean
fount: int

Javaではこのような適当な書き方は許してくれないらしい。

以下修正。

// 修正
int n;
if(n % 2 == 1) System.out.println("odd");
else System.out.println("even");

bashのexprについての疑問(追記予定)


bashで出力する方法の一番有名なものはechoだが、出力する前に計算を行いその結果を出力したい場合にはexprが使える。

read a
read b

# echoを使う場合
echo $(($a + $b))

# exprを使う場合
expr $a + $b

しかし、一部の環境ではexprがコンパイルエラーになった。なぜだろう。

気をつけるならexprではなくechoが安心だ。

AtCoder Beginner Contest 006 D - トランプ挿入ソート 誤答コード

問題

atcoder.jp

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  int ans = 0;
  cin >> n;
  vector<int> c(n);
  set<int> s;
  for(int i=0;i<n;i++) cin >> c[i];
  for(int i=0;i<n;i++) {
    if(i == 0) s.emplace(c[i]);
    else {
      if(*s.rbegin() > c[i]) ans++;
      s.emplace(c[i]);
    }
  }
  cout << ans << endl;
}

素朴すぎたか。