さまざまな言語で数値計算
Only Do What Only You Can Do
等差数列の和
初項 $ a $ , 公差 $ d $ の等差数列の 初項から第 $ n $ 項 (末項 $ l=a+(n-1)d $ ) までの和は, 次の公式で求めることができます.
この公式を使って, $ 1000 $ 未満の $ 3 $ の倍数の和を求めます.
VBScript
Option Explicit ' 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 Private Function sn(a, lim) Dim n: n = lim \ a ' 項数:n = 上限:lim / 公差:a Dim l: l = n * a ' 末項:l = 項数:n * 公差:a sn = (a + l) * n \ 2 ' 総和:sn = (初項:a + 末項:l) * 項数:n / 2 End Function ' 3 の倍数の合計 WScript.Echo sn(3, 999)
Z:\>cscript //nologo 0301.vbs 166833
JScript
// 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 function sn(a, lim) { var n = parseInt(lim / a) // 項数:n = 上限:lim / 公差:a var l = n * a // 末項:l = 項数:n * 公差:a return (a + l) * n / 2 // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } // 3 の倍数の合計 WScript.Echo(sn(3, 999))
Z:\>cscript //nologo 0301.js 166833
PowerShell
# 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 function sn($a, $lim) { $n = [math]::floor($lim / $a) # 項数:n = 上限:lim / 公差:a $l = $n * $a # 末項:l = 項数:n * 公差:a ($a + $l) * $n / 2 # 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } # 3 の倍数の合計 Write-Host (sn 3 999)
Z:\>powershell -file 0301.ps1 166833
Perl
use strict; use warnings; # 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 sub sn { my ($a, $lim) = @_; my $n = int($lim / $a); # 項数:n = 上限:lim / 公差:a my $l = $n * $a; # 末項:l = 項数:n * 公差:a ($a + $l) * $n / 2; # 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } # 3 の倍数の合計 my $sum = sn(3, 999); print $sum, "\n";
Z:\>perl 0301.pl 166833
PHP
<?php # 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 function sn($a, $lim) { $n = (int)($lim / $a); # 項数:n = 上限:lim / 公差:a $l = $n * $a; # 末項:l = 項数:n * 公差:a return ($a + $l) * $n / 2; # 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } # 3 の倍数の合計 $sum = sn(3, 999); echo $sum, "\n"; ?>
Z:\>php 0301.php 166833
Python
# coding: Shift_JIS # 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 def sn(a, lim): n = int(lim) / a # 項数:n = 上限:lim / 公差:a l = n * a # 末項:l = 項数:n * 公差:a return (a + l) * n / 2 # 総和:sn = (初項:a + 末項:l) * 項数:n / 2 # 3 の倍数の合計 print sn(3, 999)
Z:\>python 0301.py 166833
Ruby
# 初項:a, 公差:a で 上限:lim の数列の総和を返す関数 def sn(a, lim) n = lim / a # 項数:n = 上限:lim / 公差:a l = n * a # 末項:l = 項数:n * 公差:a (a + l) * n / 2 # 総和:sn = (初項:a + 末項:l) * 項数:n / 2 end # 3 の倍数の合計 sum = sn(3, 999) puts sum
Z:\>ruby 0301.rb 166833
Groovy
Pascal
Program Pas0301(arg); {$MODE delphi} // 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 function sn(a:Integer; lim:Integer):Integer; var n, l:Integer; begin n := lim div a; // 項数:n = 上限:lim / 公差:a l := n * a; // 末項:l = 項数:n * 公差:a result := (a + l) * n div 2; // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 end; begin // 3 の倍数の合計 writeln(sn(3, 999)); end.
Z:\>fpc Pas0301.pp -v0 Free Pascal Compiler version 2.6.2 [2013/02/12] for i386 Copyright (c) 1993-2012 by Florian Klaempfl and others Z:\>Pas0301 166833
Ada
VB.NET
Module VB0301 Public Sub Main() ' 3 の倍数の合計 Console.WriteLine( sn(3, 999) ) End Sub ' 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 Private Function sn(ByVal a As Integer, ByVal lim As Integer) As Integer Dim n As Integer = lim \ a ' 項数:n = 上限:lim / 公差:a Dim l As Integer = n * a ' 末項:l = 項数:n * 公差:a Return (a + l) * n \ 2 ' 総和:sn = (初項:a + 末項:l) * 項数:n / 2 End Function End Module
Z:\>vbc -nologo VB0301.vb Z:\>VB0301 166833
C#
public class CS0301 { public static void Main() { // 3 の倍数の合計 System.Console.WriteLine( sn(3, 999) ); } // 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 private static int sn(int a, int lim) { int n = lim / a; // 項数:n = 上限:lim / 公差:a int l = n * a; // 末項:l = 項数:n * 公差:a return (a + l) * n / 2; // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } }
Z:\>csc -nologo CS0301.cs Z:\>CS0301 166833
Java
public class Java0301 { public static void main(String []args) { // 3 の倍数の合計 System.out.println( sn(3, 999) ); } // 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 private static int sn(int a, int lim) { int n = lim / a; // 項数:n = 上限:lim / 公差:a int l = n * a; // 末項:l = 項数:n * 公差:a return (a + l) * n / 2; // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 } }
Z:\>javac Java0301.java Z:\>java Java0301 166833
C++
#include <iostream> using namespace std; int sn(int a, int lim); int main() { // 3 の倍数の合計 cout << sn(3, 999) << endl; return 0; } // 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 int sn(int a, int lim) { int n = lim / a; // 項数:n = 上限:lim / 公差:a int l = n * a; // 末項:l = 項数:n * 公差:a return (a + l) * n / 2; // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 }
Z:\>bcc32 CP0301.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland CP0301.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Z:\>CP0301 166833
Objective-C
#import <Foundation/Foundation.h> int sn(int a, int lim); int main (int argc, const char * argv[]) { // 3 の倍数の合計 printf("%d\n", sn(3, 999)); return 0; } // 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 int sn(int a, int lim) { int n = lim / a; // 項数:n = 上限:lim / 公差:a int l = n * a; // 末項:l = 項数:n * 公差:a return (a + l) * n / 2; // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 }
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 166833
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.
等差数列の和を求める関数
// 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 def sn(a:Int, lim:Int) = { val n = lim / a // 項数:n = 上限:lim / 公差:a val l = n * a // 末項:l = 項数:n * 公差:a (a + l) * n / 2 // 総和:sn = (初項:a + 末項:l) * 項数:n / 2 }
scala> def sn(a:Int, lim:Int) = { | val n = lim / a | val l = n * a | (a + l) * n / 2 | } sn: (a: Int, lim: Int)Int
1000未満の 3 の倍数の和
// 3 の倍数の合計
sn(3,999)
scala> sn(3,999) res0: Int = 166833
終了
scala> :quit
F#
対話型実行環境を起動
Z:\>fsi Microsoft (R) F# 2.0 Interactive build 4.0.40219.1 Copyright (c) Microsoft Corporation. All Rights Reserved. For help type #help;;
等差数列の和を求める関数
// 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 let sn a lim = let n = lim / a in // 項数:n = 上限:lim / 公差:a let l = a * n in // 末項:l = 項数:n * 公差:a (a + l) * n / 2 // 総和:sn = (初項:a + 末項:l) * 項数:n / 2
> let sn a lim = - let n = lim / a in - let l = a * n in - (a + l) * n / 2 - ;; val sn : int -> int -> int
1000未満の 3 の倍数の和
// 3 の倍数の合計
(sn 3 999)
> (sn 3 999);; val it : int = 166833
終了
> #quit;;
Clojure
対話型実行環境を起動
Z:\>java -cp C:\ProgramFiles\clojure-1.5.1\clojure-1.5.1.jar clojure.main Clojure 1.5.1
等差数列の和を求める関数
; 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 (defn sn [a, lim] (def n (quot lim a)) ; 項数:n = 上限:lim / 公差:a (def l (* a n)) ; 末項:l = 項数:n * 公差:a (quot (* (+ a l) n) 2)) ; 総和:sn = (初項:a + 末項:l) * 項数:n / 2
user=> (defn sn [a, lim] (def n (quot lim a)) (def l (* a n)) (quot (* (+ a l) n) 2)) #'user/sn
1000未満の 3 の倍数の和
; 3 の倍数の合計
(sn 3 999)
user=> (sn 3 999) 166833
終了
user=> (. System exit 0)
Haskell
-- 初項:a, 公差:a で, 上限:lim の数列の総和を返す関数 sn::Int->Int->Int sn a lim = let n = lim `div` a -- 項数:n = 上限:lim / 公差:a l = a * n -- 末項:l = 項数:n * 公差:a in (a + l) * n `div` 2 -- 総和:sn = (初項:a + 末項:l) * 項数:n / 2 -- 3 の倍数の合計 main = putStrLn (show (sn 3 999))
Z:\>runghc Hs0301.hs 166833