<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java | きいちログ</title>
	<atom:link href="https://wptech.kiichiro.work/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://wptech.kiichiro.work</link>
	<description>WordPressとかAWSとかPHPとか</description>
	<lastBuildDate>Tue, 29 Nov 2022 08:18:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>nの階乗の末尾0の数がいくつになるかを計算するプログラム (Java)</title>
		<link>https://wptech.kiichiro.work/8574vsj7yy/</link>
		
		<dc:creator><![CDATA[むらおか]]></dc:creator>
		<pubDate>Sat, 21 Nov 2020 14:13:19 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://13.115.157.198/?p=128</guid>

					<description><![CDATA[新人時代に会社のコンテストで出題された問題の回答がBitbucketに残っていたのを見つけたので、当時を思い出しながら解説してみます。もう7年前くらいの古いものなので、あんまり面白味もないですが。。 目次 問題考察解答  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>新人時代に会社のコンテストで出題された問題の回答がBitbucketに残っていたのを見つけたので、当時を思い出しながら解説してみます。<br>もう7年前くらいの古いものなので、あんまり面白味もないですが。。</p>



<span id="more-128"></span>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">問題</a></li><li><a href="#toc2" tabindex="0">考察</a></li><li><a href="#toc3" tabindex="0">解答</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">問題</span></h2>



<p><em>1~nの整数をすべてかけていった時の末尾の0の数を計算してください (0&lt;n&lt;=1000)</em><br><em>(例) 1~5の場合<br>1×2×3×4×5 = 120 だから、0は末尾に1つ</em></p>



<p>回答しか残ってなかったのですが、多分問題はこんな感じだったと思います。<br>要するに、整数nの階乗(n!)の末尾に0がいくつくっついているかを出力させるプログラムを書けば良いってことです。</p>



<h2 class="wp-block-heading"><span id="toc2">考察</span></h2>



<p>階乗の計算は、</p>



<p>n! = 1×2×3×&#8230;×(n-2)×(n-1)×n</p>



<p>になるので、1~nまでを1つずつインクリメントしてかけていけばいいじゃん！と思うのですが、nの最大が1000なので、JavaだとLongでもオーバーフローしそうな雰囲気です。<br>実は問題の<em>「末尾の0の数</em>」というのがミソで、末尾の0の数が増える条件を考えれば良かったりします。</p>



<p>末尾の0が増える = 桁が上がる = ×10される = ×2×5される と考えられます。<br>また、常に ×2の数 &gt; ×5の数 となるので、数えるのは ×5の数だけで良さそうです。</p>



<h2 class="wp-block-heading"><span id="toc3">解答</span></h2>



<p>というわけで、ソースコードは以下のようになりました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-csharp" data-file="Java" data-lang="C#"><code>import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	// ゼロの個数をカウントする
	private static int cntZero = 0;
	
	// ５で割りきれるかチェック
	private static void dividedFive(int value) {
		if (value % 5 == 0) {
			cntZero++;
			dividedFive(value /= 5);
		}
		return;
	}
	
	// 入力メソッド
	private static String scanf() {
		String str = null;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			str = br.readLine();
		} catch (IOException ioe) {
			System.err.println(&quot;入出力エラー&quot; + ioe.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return str;
	}
	
	public static void main(String[] args) {
		long inputLong = 0;
		
		System.out.println(&quot;正の整数を入力してください&quot;);

		try {
			inputLong = Integer.parseInt(scanf());
			
			if (inputLong &lt; 0) {
				System.out.println(&quot;入力された値が無効です&quot;);
				System.out.println(&quot;理由：有効範囲外です&quot;);
				return;
			}
		} catch (NumberFormatException nfe) {
			System.out.println(&quot;入力された値が無効です&quot;);
			System.out.println(&quot;理由：数値以外が入力されました&quot;);
			return;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		// 2~inputIntまでの数をループ
		for (int cnt = 2; cnt &lt;= inputLong; cnt++) {
			dividedFive(cnt);
		}
		
		System.out.println(inputLong + &quot;の階乗の末尾0の数は&quot;);
		System.out.println(cntZero + &quot;個です&quot;);
	}	
}</code></pre></div>



<p>色々ツッコミどころがありますが、新人時代の産物なんでまあいいかって感じではあります。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
