import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
class Koyomi {
public static void main
(String[] args
) { IntegerScanner intScanner
= new IntegerScanner
(new Scanner
(System.
in)); int year = intScanner.read("Year?", 2000, 2040);
int month = intScanner.read("Month?", 1, 12);
}
}
public void print(int year, int month){
int monthNext, yearNext;
if(month == 12){
monthNext = 1;
yearNext = year + 1;
}else{
monthNext = month + 1;
yearNext = year;
}
int z1 = calcZeller(year, month);
int z2 = calcZeller(yearNext, monthNext);
int lastDate = getLastDateOfMonth(z1, z2);
int pad = convertToDayOfTheWeekIndex(z1);
System.
out.
printf("\n %d年 %d月\n日 月 火 水 木 金 土\n", year, month
); List
<String
> list
= new ArrayList
<String
>(Collections.
nCopies(pad,
" ")); int i = pad;
for(int date = 1; date <= lastDate; date++){
list.
add(String.
format("%2d", date
)); if(++i == 7){
list.clear();
i = 0;
}
}
if(list.size() > 0){
}
}
/** ツェラーの式による曜日番号計算 (0=土曜日) */
int calcZeller(int year, int month) {
if (month <= 2) {
month += 12;
year -= 1;
}
int j = year / 100;
int k = year % 100;
int a = (month + 1) * 26 / 10;
int z = (1 + a + k + k / 4 + j / 4 - 2 * j) % 7;
if(z < 0) {
z += 7;
}
return z;
}
/** ツェラーの計算結果を曜日インデックス(0=日曜)に変換 */
int convertToDayOfTheWeekIndex(int zeller) {
return zeller == 0 ? 6 : zeller - 1;
}
/** 対象月初日と翌月初日の曜日のギャップから月の最終日(日数)を計算 */
int getLastDateOfMonth(int zeller1, int zeller2){
int gap = zeller2 - zeller1;
if(gap < 0){
gap += 7;
}
return 28 + gap;
}
}
class IntegerScanner {
private Scanner scanner;
public IntegerScanner(Scanner scanner) {
this.scanner = scanner;
}
public int read
(String message,
int min,
int max
) { while (true) {
System.
out.
printf("%s [%d-%d] > ", message, min, max
); String line
= this.
scanner.
nextLine(); try {
if (min <= n && n <= max) {
return n;
} else {
}
System.
out.
println("正しい入力ではありません。"); }
}
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwoKY2xhc3MgS295b21pIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBJbnRlZ2VyU2Nhbm5lciBpbnRTY2FubmVyID0gbmV3IEludGVnZXJTY2FubmVyKG5ldyBTY2FubmVyKFN5c3RlbS5pbikpOwogICAgICAgIGludCB5ZWFyID0gaW50U2Nhbm5lci5yZWFkKCJZZWFyPyIsIDIwMDAsIDIwNDApOwogICAgICAgIGludCBtb250aCA9IGludFNjYW5uZXIucmVhZCgiTW9udGg/IiwgMSwgMTIpOwogICAgICAgIG5ldyBDYWxlbmRhcigpLnByaW50KHllYXIsIG1vbnRoKTsKICAgIH0KfQoKY2xhc3MgQ2FsZW5kYXIgewogICAgcHVibGljIHZvaWQgcHJpbnQoaW50IHllYXIsIGludCBtb250aCl7CiAgICAgICAgaW50IG1vbnRoTmV4dCwgeWVhck5leHQ7CiAgICAgICAgaWYobW9udGggPT0gMTIpewogICAgICAgICAgICBtb250aE5leHQgPSAxOwogICAgICAgICAgICB5ZWFyTmV4dCA9IHllYXIgKyAxOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBtb250aE5leHQgPSBtb250aCArIDE7CiAgICAgICAgICAgIHllYXJOZXh0ID0geWVhcjsKICAgICAgICB9CgogICAgICAgIGludCB6MSA9IGNhbGNaZWxsZXIoeWVhciwgbW9udGgpOwogICAgICAgIGludCB6MiA9IGNhbGNaZWxsZXIoeWVhck5leHQsIG1vbnRoTmV4dCk7CiAgICAgICAgaW50IGxhc3REYXRlID0gZ2V0TGFzdERhdGVPZk1vbnRoKHoxLCB6Mik7CiAgICAgICAgaW50IHBhZCA9IGNvbnZlcnRUb0RheU9mVGhlV2Vla0luZGV4KHoxKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlxuICAgICAlZOW5tCAlZOaciFxu5pelIOaciCDngasg5rC0IOacqCDph5Eg5ZyfXG4iLCB5ZWFyLCBtb250aCk7CiAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvbnMubkNvcGllcyhwYWQsICIgICIpKTsKICAgICAgICBpbnQgaSA9IHBhZDsKICAgICAgICBmb3IoaW50IGRhdGUgPSAxOyBkYXRlIDw9IGxhc3REYXRlOyBkYXRlKyspewogICAgICAgICAgICBsaXN0LmFkZChTdHJpbmcuZm9ybWF0KCIlMmQiLCBkYXRlKSk7CiAgICAgICAgICAgIGlmKCsraSA9PSA3KXsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuam9pbigiICIsIGxpc3QpKTsKICAgICAgICAgICAgICAgIGxpc3QuY2xlYXIoKTsKICAgICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGxpc3Quc2l6ZSgpID4gMCl7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuam9pbigiICIsIGxpc3QpKTsKICAgICAgICB9CiAgICB9CiAgICAvKiog44OE44Kn44Op44O844Gu5byP44Gr44KI44KL5puc5pel55Wq5Y+36KiI566XICgwPeWcn+abnOaXpSkgKi8KICAgIGludCBjYWxjWmVsbGVyKGludCB5ZWFyLCBpbnQgbW9udGgpIHsKICAgICAgICBpZiAobW9udGggPD0gMikgewogICAgICAgICAgICBtb250aCArPSAxMjsKICAgICAgICAgICAgeWVhciAtPSAxOwogICAgICAgIH0KICAgICAgICBpbnQgaiA9IHllYXIgLyAxMDA7CiAgICAgICAgaW50IGsgPSB5ZWFyICUgMTAwOwogICAgICAgIGludCBhID0gKG1vbnRoICsgMSkgKiAyNiAvIDEwOwogICAgICAgIGludCB6ID0gKDEgKyBhICsgayArIGsgLyA0ICsgaiAvIDQgLSAyICogaikgJSA3OwogICAgICAgIGlmKHogPCAwKSB7CiAgICAgICAgICAgIHogKz0gNzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHo7CiAgICB9CiAgICAvKiog44OE44Kn44Op44O844Gu6KiI566X57WQ5p6c44KS5puc5pel44Kk44Oz44OH44OD44Kv44K5KDA95pel5pucKeOBq+WkieaPmyAqLwogICAgaW50IGNvbnZlcnRUb0RheU9mVGhlV2Vla0luZGV4KGludCB6ZWxsZXIpIHsKICAgICAgICByZXR1cm4gemVsbGVyID09IDAgPyA2IDogemVsbGVyIC0gMTsKICAgIH0KICAgIC8qKiDlr77osaHmnIjliJ3ml6Xjgajnv4zmnIjliJ3ml6Xjga7mm5zml6Xjga7jgq7jg6Pjg4Pjg5fjgYvjgonmnIjjga7mnIDntYLml6Uo5pel5pWwKeOCkuioiOeulyAqLwogICAgaW50IGdldExhc3REYXRlT2ZNb250aChpbnQgemVsbGVyMSwgaW50IHplbGxlcjIpewogICAgICAgIGludCBnYXAgPSB6ZWxsZXIyIC0gemVsbGVyMTsKICAgICAgICBpZihnYXAgPCAwKXsKICAgICAgICAgICAgZ2FwICs9IDc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAyOCArIGdhcDsKICAgIH0KfQoKY2xhc3MgSW50ZWdlclNjYW5uZXIgewogICAgcHJpdmF0ZSBTY2FubmVyIHNjYW5uZXI7CiAgICBwdWJsaWMgSW50ZWdlclNjYW5uZXIoU2Nhbm5lciBzY2FubmVyKSB7CiAgICAgICAgdGhpcy5zY2FubmVyID0gc2Nhbm5lcjsKICAgIH0KICAgIHB1YmxpYyBpbnQgcmVhZChTdHJpbmcgbWVzc2FnZSwgaW50IG1pbiwgaW50IG1heCkgewogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlcyBbJWQtJWRdID4gIiwgbWVzc2FnZSwgbWluLCBtYXgpOwogICAgICAgICAgICBTdHJpbmcgbGluZSA9IHRoaXMuc2Nhbm5lci5uZXh0TGluZSgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaW50IG4gPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUpOwogICAgICAgICAgICAgICAgaWYgKG1pbiA8PSBuICYmIG4gPD0gbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi56+E5Zuy5aSW44Gn44GZIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuato+OBl+OBhOWFpeWKm+OBp+OBr+OBguOCiuOBvuOBm+OCk+OAgiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cg==