タイトル説明
この質問の意味は、整数の範囲を再定義することです。計算するときは、数値の範囲に注意を払う必要があります。そうしないと、問題が発生します。
注:負の数を考慮する必要があります
#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n<0){
if(n%2==0)
cout<<"Underflow!"<<endl;
else
cout<<"Overflow!"<<endl;
}
else
{
long long sum=1;
for(int i=1;i<=n;i++){
sum*=i;
if(sum>6227020800)
break;
}
if(sum<10000)
cout<<"Underflow!"<<endl;
else if(sum>6227020800)
cout<<"Overflow!"<<endl;
else
cout<<sum<<endl;
}
}
return 0;
}
この質問は、条件を満たすNの範囲、ボスのコードを計算するためにテーブルメソッドを取ることもできます
/* UVA10323 Factorial! You Must be Kidding!!! */
#include <bits/stdc++.h>
//#define DEBUG
using namespace std;
const long long FACT1 = 10000;
const long long FACT2 = 6227020800;
const int N = 13;
long long fact[N + 1];
void init()
{
fact[0] = 1;
for(int i=1; i<=N; i++) {
fact[i] = i * fact[i - 1];
#ifdef DEBUG
if(fact[i] > FACT2) {
printf("N=%d\n", i - 1);
break;
}
#endif
}
}
int main()
{
init();
int n;
while(~scanf("%d", &n))
if(n > N || (n < 0 && (n * -1 & 1)== 1))
printf("Overflow!\n");
else if(fact[n] < FACT1 || (n < 0 && (n * -1 & 1) == 0))
printf("Underflow!\n");
else
printf("%lld\n", fact[n]);
return 0;
}