home > さまざまな言語で数値計算 > 数列の和 >

さまざまな言語で数値計算

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
inserted by FC2 system