ホームページ データベース mysql チュートリアル 【编程之美】2.2不要被阶乘吓到

【编程之美】2.2不要被阶乘吓到

Jun 07, 2016 pm 03:17 PM
整数 与えられた プログラミング 階乗

题目: 1:给定一个整数N,那么N的阶乘N!末尾有多少个0?例如N = 10,N!= 3628800,末尾有两个0. 2:求N!的二进制表示中最低位1的位置。 问题一: 题目解析: 这道题如果直接求N!的话也可以,不过万一溢出了怎么办?即使定义longlong类型的也不合适。那


题目:

1:给定一个整数N,那么N的阶乘N!末尾有多少个0?例如N = 10,N!= 3628800,末尾有两个0.

2:求N!的二进制表示中最低位1的位置。



问题一:

题目解析:

这道题如果直接求N!的话也可以,不过万一溢出了怎么办?即使定义longlong类型的也不合适。那么就要找寻其中的规律,一般这类题目都可以通过分析,找到一个很简单的方法。


思路一:

我们想想0是怎么来的?乘以10就增加一个0,而10可以通过2*5的来。好了,我们将N!表达式表达出来,看能获得多少个2*5。N! = 2^x * 3^y * 5^z... 由于2比5小,所以x比z要大。所以看N!中有多少个5就可以了。

int Count(int n)
{
    int num = 0;
    for(int i = 1;i <br>
思路二:
<p><span>我们可以利用公式Z = [N/5] + [N/(5^2)] + [N/(5^3)] +....</span></p>
<p><span>这个公式表达什么意思呢?N/5表示从1-N中有多少个数是5的倍数,那么这些数,每一个都贡献一个5;好了但是对于25会贡献两个,在除以5的时候,已经算进去1个,那么N/(5^2)的时候,看看有多少是25的倍数,也算一下,这时将25中的另一个5给算进去了;同理对于75,当我们N/75的时候,正好把三个5全算进去……通过这个方法,更简化程序的实现。</span></p>
<p></p><pre class="brush:php;toolbar:false">int Count1(int n)
{
    int num = 0;
    while(n){
        num += n/5; //这种方法更简洁,避免了附设变量
        n = n/5;
    }
    return num;
}
ログイン後にコピー


问题二:

说白了,问题2跟问题1是一样的,求N!2的倍数。

思路一:

根据上题的情况,写出如下表达式求表达式N! = 2^x * 3^y * 5^z... 我们要求x的值为多少。也可以通过遍历1-N一个一个求解

int Count2(int n)
{
    int num = 0;
    for(int i =0;i > 1;
        }
    }
    return num;
}
ログイン後にコピー

思路二:

类似问题一中的公式,我们也可以写出Z = [N/2] + [N/(2^2)] + [N/(2^3)] +....

int Count3(int n)
{
    int num = 0;
    while(n){
        n = n >> 1;
        num += n;   //这句话写在下面,更好
    }
    return num;
}
ログイン後にコピー

思路三:

N!含有质因数2的个数,还等于N减去N的二进制表示中1的数目。——这是一种巧妙的方法,是根据Z = [N/2] + [N/(2^2)] + [N/(2^3)] +....运算得到的,因为除以2,相当于右移一位,对于11011我们有:

Z = 1101 + 110 + 11 + 1 = (1000 + 100 + 1) + (100 + 10) + (10 +1) + 1 

   = 1111 + 111 + 1 = (10000 - 1) + (1000 - 1) + (10 - 1) + (1 - 1) = 11011 - (N二进制中1的个数)



相关题目:

给定整数n,判断它是否为2的方幂。

(2的方幂为2^X。所以表示为二进制的时候,只有一位为1,那么利用判断二进制的个数的方法来判断: n>0 && ((n && (n-1)) == 0))




このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

正規表現を使用してPHP配列から重複した値を削除します 正規表現を使用してPHP配列から重複した値を削除します Apr 26, 2024 pm 04:33 PM

正規表現を使用して PHP 配列から重複値を削除する方法: 正規表現 /(.*)(.+)/i を使用して、重複値を照合して置換します。配列要素を反復処理し、preg_match を使用して一致をチェックします。一致する場合は値をスキップし、一致しない場合は重複値のない新しい配列に追加します。

プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? プログラミングは何のためにあるのか、それを学ぶと何の役に立つのか? Apr 28, 2024 pm 01:34 PM

1. プログラミングは、Web サイト、モバイル アプリケーション、ゲーム、データ分析ツールなど、さまざまなソフトウェアやアプリケーションの開発に使用できます。その応用分野は非常に幅広く、科学研究、医療、金融、教育、エンターテイメントなど、ほぼすべての業界をカバーしています。 2. プログラミングを学ぶことは、問題解決スキルと論理的思考スキルを向上させるのに役立ちます。プログラミング中、問題を分析して理解し、解決策を見つけてコードに変換する必要があります。この考え方は、分析能力と抽象能力を養い、実際的な問題を解決する能力を向上させることができます。

内なるプログラマーを解き放つ: まったくの初心者のための C 内なるプログラマーを解き放つ: まったくの初心者のための C Oct 11, 2024 pm 03:50 PM

C は初心者がプログラミングを学ぶのに理想的な言語であり、効率性、汎用性、移植性などの利点があります。 C 言語の学習には次のことが必要です。 C コンパイラ (MinGW や Cygwin など) をインストールする 変数、データ型、条件文、ループ文を理解する main 関数と printf() 関数を含む最初のプログラムを作成する 実際のケースによる練習 (平均値の計算など) C言語の知識

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

Golang を使用してブラウザベースのアプリケーションを構築する Golang を使用してブラウザベースのアプリケーションを構築する Apr 08, 2024 am 09:24 AM

Golang を使用してブラウザベースのアプリケーションを構築する Golang は JavaScript と組み合わせて、動的なフロントエンド エクスペリエンスを構築します。 Golang をインストールする: https://golang.org/doc/install にアクセスします。 Golang プロジェクトをセットアップします。 main.go というファイルを作成します。 GorillaWebToolkit の使用: HTTP リクエストを処理するための GorillaWebToolkit コードを追加します。 HTML テンプレートの作成: template サブディレクトリに、メイン テンプレートであるindex.html を作成します。

Go Get を使用して Go モジュールをすばやく簡単に入手します Go Get を使用して Go モジュールをすばやく簡単に入手します Apr 07, 2024 pm 09:48 PM

GoGet を使用すると、Go モジュールをすばやく簡単に取得できます。手順は次のとおりです: ターミナルで goget[module-path] を実行します。ここで、 module-path はモジュール パスです。 GoGet は、モジュールとその依存関係を自動的にダウンロードします。インストールの場所は、GOPATH 環境変数によって指定されます。

C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます C++ プログラミング パズルのコレクション: 思考を刺激し、プログラミング スキルを向上させます Jun 01, 2024 pm 10:26 PM

C++ プログラミング パズルは、フィボナッチ数列、階乗、ハミング距離、配列の最大値と最小値などのアルゴリズムとデータ構造の概念をカバーします。これらのパズルを解くことで、C++ の知識を強化し、アルゴリズムの理解とプログラミング スキルを向上させることができます。

GoFmt コマンド: コードをクリーンで美しく保つコード整形ツール GoFmt コマンド: コードをクリーンで美しく保つコード整形ツール Apr 07, 2024 pm 09:03 PM

GoFmt コマンドは、Go 言語スタイル ガイドの規則に準拠するように Go ソース コードを自動的にフォーマットできるコード フォーマット ツールで、コードの読みやすさ、一貫性、美しさを向上させます。使用法: ターミナルで gofmtsource_files.go と入力します。詳細オプションには、-w を使用してフォーマットされたコードをソース ファイルに書き込みます。-d を使用して、行われる変更のみを表示します。-e を使用して、フォーマットされていないファイルを報告します。

See all articles