fortran66のブログ

fortran について書きます。

ProjectEuler

Problem 16

2^1000を求めるのに手抜きして多倍長整数ライブラリ FMLIB を利用させていただきました。2^1000〜10^300なので300桁強の文字列を用意しました。 ソース・プログラム program PEuler016 use fmzm implicit none character(len = 350) :: str integer :: k(350…

Problem 15

をパスカルの三角形で求めます。4バイト整数ではオーバーフローします。 ソース・プログラム program PEuler015 implicit none integer, parameter :: ki = selected_int_kind(15), n = 20 integer :: i integer(ki), allocatable :: ipascal(:) ipascal = …

Problem 14

工夫せず素朴に求めます。4バイト整数ではオーバーフローしました。 ソース・プログラム program PEuler014 implicit none integer :: i, k, kk(1e6) integer(8) :: m do i = 1, 1e6 k = 1 m = i do if (mod(m, 2) == 0) then m = m / 2 else m = 3 * m + 1 …

Problem 013

多倍長計算が面倒なので、既存のライブラリ FMLIB を利用することにします。MPFUN とどっちがいいのかよくわかりません。 数字列はファイルから読み取った方が楽だと思いましたが、まぁ整形してソース・プログラム中にべたうちすることにしました。 ソース・…

Problem 012

i番目の三角数は i(i+1)/2 素因数分解は i, i+1, 2 についてやって足し引きする。約数の数は素因数に1足して積。 ソース・プログラム program PEuler012 implicit none integer :: i, k1, k2, n integer, allocatable :: ipfac(:), ipfac0(:), ipfac1(:) i =…

Problem 011

めんどくさいw 美しくない。 ソース・プログラム この入力だと配列の列と行が反対になってる。 program PEuler011 implicit none integer, parameter :: n = 20 integer, parameter :: itab(n, n) = [ & ! transpose [08,02,22,97,38,15,00,40,00,75,04,05,…

problem 006

ソース・プログラム program PEuler6 implicit none integer :: i, k(100) = [(i, i = 1, 100)] print *, sum(k)**2 - sum(k**2) ! !print *, sum([1:100])**2 - sum([1:100]**2) ! non-standard stop end program PEuler6 実行結果 25164150 続行するには何…

problem 005

ソース・プログラム program PEuler5 implicit none integer, parameter :: n = 20 integer, allocatable :: itab(:), ipow(:) integer :: k itab = ieratos(n) ipow = log(real(n)) / log(real(itab)) ! max prime power print *, product(itab**ipow) ! lc…

problem 004

これは2,3秒かかる。ソートして大きい数から探せば早くなろう。 ソース・プログラム program PEuler4 implicit none integer, parameter :: n = 999 integer :: itab(n, n) = 0 integer, allocatable :: q(:) integer :: i, j forall(i = 1:n, j = 1:n, i…

problem 003

ソース・プログラム program PEuler3 implicit none integer, parameter :: ki = selected_int_kind(12) integer(ki), parameter :: nx = 600851475143 !13195 integer, allocatable :: iptab(:) iptab = ieratos( int(sqrt(real(nx))) ) ! prime numbers up…

problem 002

ソース・プログラム program PEuler2 implicit none integer :: ifib0, ifib1, ifib2, isum ifib0 = 1 ifib1 = 2 isum = ifib1 do ifib2 = ifib0 + ifib1 if (ifib2 > 4 * 10**6) exit if (mod(ifib2, 2) == 0) isum = isum + ifib2 ifib0 = ifib1 ifib1 = i…

problem 001

あんまりやる気もしないが、たまに暇つぶしに。 http://projecteuler.net/ ソース・プログラム program PEuler1 implicit none integer, parameter :: nn = 1000 - 1 integer :: i, num(nn) num = [(i, i = 1, nn)] print *, sum(num, mask = mod(num, 3) ==…

problem 010

素数の総和は4バイト整数からオーバーフローしてしまいました。 ソース・プログラム program PEuler010 implicit none print *, sum( int(ieratos(2 * 10**6), kind = 8) ) ! int4 overflow stop contains function ieratos(n) ! thieve of Eratostenes int…

problem 009

テキトーw ソース・プログラム program PEuler009 implicit none integer :: ia, ib, ic ! a^2 + b^2 = c^2 do ic = 1, 1000 do ib = 1, ic - 1 if (ib > ic) exit ia = 1000 - ib - ic if (ia > ib) cycle if (ia <= 0) exit if (ia * ia + ib * ib == ic …

problem 008

ソース・プログラム program PEuler008 implicit none character(len = 1000) :: fig = & '73167176531330624919225119674426574742355349194934& &96983520312774506326239578318016984801869478851843& &858615607891129494954595017379583319528532088055…

problem 007

ガウスの素数定理によって大体の値の見当をつけてそこまでの素数をやや大目に求めます。 ソース・プログラム program PEuler007 implicit none integer, parameter :: np = 10001 integer, allocatable :: iptab(:) integer :: n ! np ~ n / log(n) ! approx…