UVA 10323階乗!冗談でしょう!!!

タイトル説明

ここに画像の説明を挿入
この質問の意味は、整数の範囲を再定義することです。計算するときは、数値の範囲に注意を払う必要があります。そうしないと、問題が発生します。

注:負の数を考慮する必要があります

#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;
}
 

おすすめ

転載: blog.csdn.net/qaqaqa666/article/details/112848318
おすすめ