さまざまな言語で数値計算
Only Do What Only You Can Do
等差数列の積 (非再帰版)
初項 $ a $, 公差 $ d $ の等差数列の初項から第 $ n $ 項までの積は, 次の式で表せます.
また, 記号を用いて
と表すこともできます.
しかし, は, 記述を簡潔にしているだけで, 計算が簡単になっているわけではありません.
たとえば, 初項 $ 5 $ , 公差 $ 3 $ の等差数列 $ 5, 8, 11, 14 $ の積 は
であり, 素直に数列を順番に乗算して行った方が早いです.
この節では, 通常の繰り返し処理を使って, 初項 $ 5 $, 公差 $ 3 $, 項数 $ 10 $ の数列の積を求めます.
VBScript
Option Explicit Dim a: a = 5 '初項 5 Dim d: d = 3 '公差 3 Dim n: n = 10 '項数 10 Dim p: p = 1 '積 Dim m Dim i For i = 1 To n m = a + (d * (i - 1)) WScript.StdOut.Write m & " * " & p & " = " p = p * m WScript.Echo p Next
Z:\>cscript //nologo 0401.vbs 5 * 1 = 5 8 * 5 = 40 11 * 40 = 440 14 * 440 = 6160 17 * 6160 = 104720 20 * 104720 = 2094400 23 * 2094400 = 48171200 26 * 48171200 = 1252451200 29 * 1252451200 = 36321084800 32 * 36321084800 = 1162274713600
JScript
var a = 5 // 初項 5 var d = 3 // 公差 3 var n = 10 // 項数 10 var p = 1 // 積 for (var i = 1; i <= n; i++) { var m = a + (d * (i - 1)) p *= m } WScript.Echo(p)
Z:\>cscript //nologo 0401.js 1162274713600
PowerShell
$a = 5 # 初項 5 $d = 3 # 公差 3 $n = 10 # 項数 10 $p = 1 # 積 foreach ($i in 1..$n) { $m = $a + ($d * ($i - 1)) $p *= $m; } Write-Host $p
Z:\>powershell -file 0401.ps1 1162274713600
Perl
$a = 5; # 初項 5 $d = 3; # 公差 3 $n = 10; # 項数 10 $p = 1; # 積 for (1..$n) { $m = $a + ($d * ($_ - 1)); $p *= $m; } print $p;
Z:\>perl 0401.pl 1162274713600
PHP
<?php $a = 5; # 初項 5 $d = 3; # 公差 3 $n = 10; # 項数 10 $p = 1; # 積 foreach (range(1, $n) as $i) { $m = $a + ($d * ($i - 1)); $p *= $m; } echo $p; ?>
Z:\>php 0401.php 1162274713600
Python
a = 5 # 初項 5 d = 3 # 公差 3 n = 10 # 項数 10 p = 1 # 積 for i in range(1, n + 1): m = a + (d * (i - 1)) p *= m print p
Z:\>python 0401.py 1162274713600
Ruby
a = 5 # 初項 5 d = 3 # 公差 3 n = 10 # 項数 10 p = 1 # 積 (1..n).each do |i| m = a + (d * (i - 1)) p *= m end puts p
Z:\>ruby 0401.rb 1162274713600
Groovy
Pascal
Program Pas0401(arg); const a:Integer = 5; // 初項 5 d:Integer = 3; // 公差 3 n:Integer = 10; // 項数 10 var p:Int64 = 1; // 積 m:Integer; i:Integer; begin for i := 1 to n do begin m := a + (d * (i - 1)); p := p * m; end; writeln(p); end.
Z:\>fpc Pas0401.pp -v0 Free Pascal Compiler version 2.6.2 [2013/02/12] for i386 Copyright (c) 1993-2012 by Florian Klaempfl and others Z:\>Pas0401 1162274713600
Ada
VB.NET
Option Explicit Module VB0401 Sub Main() Dim a As Integer = 5 '初項 5 Dim d As Integer = 3 '公差 3 Dim n As Integer = 10 '項数 10 Dim p As Long = 1 '積 For i As Integer = 1 To n Dim m As Integer = a + (d * (i - 1)) p *= m Next Console.WriteLine(p) End Sub End Module
Z:\>vbc -nologo VB0401.vb Z:\>VB0401 1162274713600
C#
using System; public class CS0401 { public static void Main() { int a = 5; // 初項 5 int d = 3; // 公差 3 int n = 10; // 項数 10 long p = 1; // 積 for (int i = 1; i <= n; i++) { int m = a + (d * (i - 1)); p *= m; } Console.WriteLine(p); } }
Z:\>csc -nologo CS0401.cs Z:\>CS0401 1162274713600
Java
public class Java0401 { public static void main(String []args) { int a = 5; // 初項 5 int d = 3; // 公差 3 int n = 10; // 項数 10 long p = 1; // 積 for (int i = 1; i <= n; i++) { int m = a + (d * (i - 1)); p *= m; } System.out.println(p); } }
Z:\>javac Java0401.java Z:\>java Java0401 1162274713600
C++
#include <iostream> using namespace std; int main() { int a = 5; // 初項 5 int d = 3; // 公差 3 int n = 10; // 項数 10 __int64 p = 1; // 積 for (int i = 1; i <= n; i++) { int m = a + (d * (i - 1)); p *= m; } cout << p << endl; return 0; }
Z:\>bcc32 CP0401.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland CP0401.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Z:\>CP0401 1162274713600
Objective-C
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { int a = 5; // 初項 5 int d = 3; // 公差 3 int n = 10; // 項数 10 long p = 1; // 積 int i; for (i = 1; i <= n; i++) { int m = a + (d * (i - 1)); p *= m; } printf("%ld\n", p); return 0; }
Compiling the source code.... $gcc `gnustep-config --objc-flags` -L/usr/GNUstep/System/Library/Libraries -lgnustep-base main.m -o demo -lm -pthread -lgmpxx -lreadline 2>&1 Executing the program.... $demo 1162274713600
D
Go
Scala
対話型実行環境を起動
Z:\>scala Welcome to Scala version 2.10.2 (Java HotSpot(TM) Client VM, Java 1.7.0_21). Type in expressions to have them evaluated. Type :help for more information.
項数 10 の数列
(0 to 9)
res0: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
初項 5, 公差 3, 項数 10 の数列
(0 to 9).map(n => n * 3 + 5)
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(5, 8, 11, 14, 17, 20, 23, 26, 29, 32)
初項 5, 公差 3, 項数 10 の数列の積
(0l to 9l).map(n => n * 3 + 5).product
res2: Long = 1162274713600
終了
scala> :quit
F#
対話型実行環境を起動
Z:\>fsi Welcome to Scala version 2.10.2 (Java HotSpot(TM) Client VM, Java 1.7.0_21). Type in expressions to have them evaluated. Type :help for more information.
項数 10 の数列
[0..9]
val it : int list = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9]
初項 5, 公差 3, 項数 10 の数列
[0..9] |> List.map (fun n -> n * 3 + 5)
val it : int list = [5; 8; 11; 14; 17; 20; 23; 26; 29; 32]
初項 5, 公差 3, 項数 10 の数列の積
[0L..9L] |> List.map (fun n -> n * 3L + 5L) |> List.reduce(*)
val it : int64 = 1162274713600L
終了
> #quit;;
Clojure
対話型実行環境を起動
Z:\>java -cp C:\ProgramFiles\clojure-1.5.1\clojure-1.5.1.jar clojure.main Clojure 1.5.1
項数 10 の数列
(range 0 10)
(0 1 2 3 4 5 6 7 8 9)
初項 5, 公差 3, 項数 10 の数列
(map #(+ 5 (* 3 %)) (range 0 10))
(5 8 11 14 17 20 23 26 29 32)
初項 5, 公差 3, 項数 10 の数列の積
(apply * (map #(+ 5 (* 3 %)) (range 0 10)))
1162274713600
終了
user=> (. System exit 0)
Haskell
対話型実行環境を起動
Z:\>ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done.
項数 10 の数列
[0..9]
[0,1,2,3,4,5,6,7,8,9]
初項 5, 公差 3, 項数 10 の数列
map(\n -> n * 3 + 5)[0..9]
[5,8,11,14,17,20,23,26,29,32]
初項 5, 公差 3, 項数 10 の数列の積
product $ map(\n -> n * 3 + 5)[0..9]
1162274713600
終了
Prelude> :quit Leaving GHCi.