{ }codelper
負の剰余P0016

何日後の曜日

曜日を番号で表す:0 日曜日、1 月曜日、2 火曜日、3 水曜日、4 木曜日、5 金曜日、6 土曜日。
一行目に今日の曜日番号 d、二行目に整数 k が与えられる。
今日から k 日後の曜日番号(0〜6)を出力せよ。
k が負なら |k| 日前を、0 なら今日を表す。

入力
0 ≤ d ≤ 6、-1,000,000,000 ≤ k ≤ 1,000,000,000
出力
0 以上 6 以下の曜日番号を一行
例 1 · stdin
1
10
stdout
4
例 2 · stdin
0
-1
stdout
6
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

核心は (d + k) % 7 ですが、余りの符号が言語ごとに違います。
Python の % は割る数(7)と同じ符号なので -1 % 7 が 6 になり、そのまま正しいです。
C・C++・Java・C#・JS・TS・Craykon の % は割られる数の符号に従い(0 の方へ切り捨てた割り算の余り)、-1 % 7 は -1 です。
そこで ((d + k) % 7 + 7) % 7 のように 7 を足してもう一度割ります。
Java にはこれをしてくれる Math.floorMod(d + k, 7) があります。
負になったからと絶対値をとってはいけません — 日曜日(0)の前日が土曜日(6)ではなく月曜日(1)になります。
Craykon では ((d + k) % 7 + 7) % 7 と書きます。

Pythonmain.py · 4 行
d = int(input())k = int(input())# Python의 %는 나누는 수(7)와 같은 부호 — 늘 0~6이 나온다print((d + k) % 7)
JavaScriptmain.js · 3 行
const [d, k] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// JS의 %는 나뉘는 수의 부호를 따라서 -1 % 7 === -1 — 7을 더해 한 번 더 나눈다console.log((((d + k) % 7) + 7) % 7);
TypeScriptmain.ts · 3 行
import { readFileSync } from "node:fs";const [d, k]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);console.log((((d + k) % 7) + 7) % 7);
JavaMain.java · 11 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int d = sc.nextInt();        int k = sc.nextInt();        // floorMod는 결과가 나누는 수와 같은 부호(0~6). %는 -1 % 7 == -1        System.out.println(Math.floorMod(d + k, 7));    }}
C#Main.cs · 12 行
using System; class Program{    static void Main()    {        int d = int.Parse(Console.ReadLine().Trim());        int k = int.Parse(Console.ReadLine().Trim());        // C#의 %는 나뉘는 수의 부호를 따른다 — 7을 더해 0~6으로        Console.WriteLine(((d + k) % 7 + 7) % 7);    }}
C++main.cpp · 7 行
#include <iostream> int main() {    int d, k;    std::cin >> d >> k;    std::cout << ((d + k) % 7 + 7) % 7 << '\n';}
Cmain.c · 9 行
#include <stdio.h> int main(void) {    int d, k;    scanf("%d %d", &d, &k);    /* C의 %는 0 쪽으로 버린 나눗셈의 나머지라 음수가 나올 수 있다 */    printf("%d\n", ((d + k) % 7 + 7) % 7);    return 0;}
Craykonmain.cray · 4 行
d = コンソール.行読み().数に();k = コンソール.行読み().数に();// 크레이콘의 %도 JS처럼 -1 % 7 == -1 — 7을 더해 한 번 더 나눈다コンソール.書く(((d + k) % 7 + 7) % 7);