AcWing1381。階乗c ++問題の解決策

1.タイトル

Nの階乗(N!として示される)は、1からN(1とNを含む)までのすべての整数の積を指します。

階乗演算の結果は、多くの場合非常に大きくなります。

さて、数Nが与えられたら、Nの右端の非ゼロ数を見つけてください!

たとえば、5!= 1×2×3×4×5 = 120であるため、ゼロ以外の右端の5!の数は2です。

入力形式は
1行で、整数Nが含まれています。

出力形式
N!の右端の非ゼロ数を表す整数を出力します。

データ範囲
1≤N≤1000
入力例:
7
出力例:
4

2.分析

ここに画像の説明を挿入
データを観察すると、ルールを見つけることができます。数値nの階乗n!末尾11つ以上が含まれている場合必要なのはゼロ以外の右端であるため、最終結果に影響を与えない0末尾0の部分削除できます。n!数。

このようにn!、を解くとき、私たちは常に数値が10整数であるかどうかを判断し、整数である場合は、最後の0ビットを削除します。(m = n!)

これは while(m%10==0) m/=10

しかし、これはまだ十分ではなく、n!それでも大きく、long long範囲を超えるため、現時点ではn!、最後のnビット取るという有効な部分のみを保持することを検討する必要があります。

検証は、n服用36間可能です。計算のために最後の3ビットを保持します。

これは m%=1000

3.ACコード

#include<iostream>

using namespace std;

int main()
{
    
    
	int n;
	cin >> n;
	int m = 1;
	for (int i = 1; i <= n; i++)
	{
    
    
		m *= i;
		while (m % 10 == 0) m /= 10;  // 去除末尾为0的位
		m %= 1000;   //保留后三位
	}
	cout << m % 10 << endl;
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45629285/article/details/113063273