題目描述
在比賽中,根據數據范圍,分析清楚變量的取值范圍,是非常重要的。int 類型變量與 int 類型變量相乘,往往可能超出 int 類型可以表示的取值范圍。
現在,給出兩個 int 類型變量?x,y?及其取值范圍,請問?x×y?的值是否可能超過 int 類型可以表示的范圍?
提示:int 類型可以表示的范圍為?[?2147483648,2147483647],即?[?231,231?1]。也就是,int 類型可以表示的最小值為??2147483648,最大值為?2147483647。
輸入格式
輸入共兩行。
輸入的第一行為兩個整數?xl?,xu?,表示變量?x?的取值范圍為?xl?≤x≤xu?。
輸入的第二行為兩個整數?yl?,yu?,表示變量?y?的取值范圍為?yl?≤y≤yu?。
輸出格式
輸出一行一個字符串:
- 若會超過,則輸出?
long long int
; - 若不會超過,則輸出?
int
。
輸入輸出樣例
輸入 #1復制
1 5 1 5
輸出 #1復制
int
輸入 #2復制
-2147483647 2147483647 -2147483647 2147483647
輸出 #2復制
long long int
說明/提示
數據規模與約定
- 對于?50%?的測試數據,0≤xl?≤xu?<231,0≤yl?≤yu?<231。
- 對于?100%?的測試數據,?231≤xl?≤xu?<231,?231≤yl?≤yu?<231。
題解?
#include<iostream>
#include<cmath>
#define MAX 2147483467
#define NMAX -2147483648
using namespace std;int main(){int xl,xu,yl,yu;long long int xmax,ymax;cin>>xl>>xu>>yl>>yu;if(xl>MAX||xl<NMAX||xu>MAX||xu<NMAX||yl>MAX||yl<NMAX||yu>MAX||yu<NMAX){cout<<"long long int"<<endl;return 0;}if(abs(xu)>=abs(xl))xmax=xu;else xmax=xl;if(abs(yu)>=abs(yl))ymax=yu;else ymax=yl;if(xmax*ymax>MAX||xmax*ymax<NMAX)cout<<"long long int"<<endl;elsecout<<"int"<<endl;return 0;
}
本題還有一種思路是利用各范圍乘值溢出后的錯誤結果與long long int存放的正確結果相比較,任意不等則有溢出(C++數據自然溢出)