知っている方のブログを見ると天下一プログラマコンテストなるものが
あるということを知り,アクセス.
もう終了してはいるが,提出することはできるので挑戦.
まだ8/29日8:00~20:00の予選Cが残っているのでまだまだ本選へのアタックは可能です.
今回は,予選Bの内容を少しやってみることに.
予選B1問目の内容はこちら.
いま、物が有る。
その数は 1 以上 127 以下である。
3 で割ると、 a 余る。 5 で割ると、 b 余る。 7 で割ると、 c 余る。
いくつ物があるとそうなるか小さい順に答えよ。
なんか問題がおかしい気がするが,(いくつものがあるってなんだ?)
とりあえず,入力と出力を見たらなんとなくわかった.
入力は以下の形式で標準入力から与えられる。
a b c
条件を満たす物の数を小さい順に改行区切りで出力せよ。
なお、行の終端には改行が必要である。
そして作ったコードはこちら
#include<stdio.h> int main(void){ int a,b,c; int test=0; int count=0; scanf("%d %d %d\n",&a,&b,&c); while(7*count+c<=127){ test = 7*count+c; if(test==0){count++;continue;} if(test%5==b&&test%3==a){ printf("%d\n",test); } count++; } }
入力の改行を完全に忘れてました.
何回かミスをした後に受理.
ここまでだと,よりスマートにやりそうな人がいそうなので,
プログラミング初心者の人に対しても理解できるように解説してみる.
まず,最初の#includeはおまじない.もう少し説明すると標準入出力を担当するstdio.hを利用する宣言とのことになる.大概のプログラミングでは使うからそこは置いておく.
次に3つの入力を得るための変数が必要になる.今回は範囲が決まっていて整数であるのでint型を3つ用意.testはあとで判定とかに使うための値を代入する変数.
さて,次はwhile文.繰り返し文であるが,7*count+c<=127をクリアしたら中に入っている処理を行うというものである.
今回は処理の回数を減らすために,7で割った時の条件に合致する整数が他の条件に合うかどうかを確認する.
問題としては,count=0かつa=b=c=0のとき,出力する数字は1以上であることが条件であるが,何の対策もしなければ0であってもこのままでは条件を満たしてしまう.次の倍数への対応をするためにcount++をしてcontinue文を入れる.continue文はその時点でその回の繰り返し処理をやめることを意味する.(continue文丘の処理は実行されず,再度繰り返しの条件文を判定し,処理を行う.)
あとは5で割った余りと3で割った余りを考えて,出力させれば終わり.
それではこれをjavaで書いてみる.
import java.util.Scanner; public class ProblemB1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] a = new int[3]; a[0]=sc.nextInt(); a[1]=sc.nextInt(); a[2]=sc.nextInt(); for(int count=0;7*count+a[2]<=127;count++) if(tester(a,7*count+a[2])){ System.out.println(7*count+a[2]); } } public static boolean tester(int[] a,int test){ if(test==0)return false; else if(test%5==a[1]&&test%3==a[0]){return true;} else {return false;} } }
判定の部分をtesterという関数を作ったところ以外はあまり変わりはない.
違いとしては入力を受け付けるところ.
Cでは入力形式の形でscanfをする必要があるが,JavaのほうではnextIntというメソッドで取れる.