AtCoder Beginner Contest 169 A問題「Multiplication 1」の解説を行います。
#問題概要
整数$A$,$B$が与えられる。
$A×B$を求めよ。
##制約
・$1 \leq A \leq 100$
・$1 \leq B \leq 100$
・入力は全て整数
#解説
問題文通りに実装すれば良いです。
以下、Python3,C++,Javaでの解答例を示します。
Python3での解答例
x,y = map(int,input().split())
print(x*y)
C++での解答例
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y;
cin >> x >> y;
cout << x * y << endl;
}
Javaでの解答例
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner (System.in);
int x = scan.nextInt();
int y = scan.nextInt();
System.out.println(x*y);
}
}
$X×Y$を求めよ。
ただし制約は以下の通りである。
・$1 \leq X \leq 10^5$
・$1 \leq Y \leq 10^5$
Python3の場合はint型で扱える値は無限なので大丈夫なのですが、
C++の解答例のコードでこの問題の最大制約の場合で実行してみます。
入力
100000 100000
出力
1410065408
本来、$10^5 × 10^5 = 10^{10}$なので、このような表記にはならない...と思った方も多いと思います。
これはオーバーフローという、C++やJava等、int型で表現できる値で制限がかかっている言語で発生する現象です。
$10^{10}$ を $2^{31}$で割ると余りが$1410065408$となります。
C++やJavaのint型で表現できるのは $-2^{31}$から$2^{31}-1$までの値です。
よってint型とint型の積がint型であることから、このようなオーバーフローが発生してしまうのです。
C++では、例えば long long int
を使うことで表現できる値が増えます。
long long int
で表現できる値は$-2^{63}$から$2^{63}-1$です。
よって、以下のコードを書けば先ほどのような問題を回避できます。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long int x,y;
cin >> x >> y;
cout << x * y << endl;
}
10000000000
AtCoderの問題文やサンプルには たまにオーバーフローに注意して下さい
や32bit 整数に収まらない場合もある.
などの表記がある場合があります。
そのような場合は、変数の型がlong long int
であるかどうかを疑ってから提出するようにしましょう。
余計なWA(不正解)ができてしまいペナルティ5分が発生してしまうので....