ProjectEuler
2^1000を求めるのに手抜きして多倍長整数ライブラリ FMLIB を利用させていただきました。2^1000〜10^300なので300桁強の文字列を用意しました。 ソース・プログラム program PEuler016 use fmzm implicit none character(len = 350) :: str integer :: k(350…
をパスカルの三角形で求めます。4バイト整数ではオーバーフローします。 ソース・プログラム program PEuler015 implicit none integer, parameter :: ki = selected_int_kind(15), n = 20 integer :: i integer(ki), allocatable :: ipascal(:) ipascal = …
工夫せず素朴に求めます。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 …
多倍長計算が面倒なので、既存のライブラリ FMLIB を利用することにします。MPFUN とどっちがいいのかよくわかりません。 数字列はファイルから読み取った方が楽だと思いましたが、まぁ整形してソース・プログラム中にべたうちすることにしました。 ソース・…
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 =…
めんどくさい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,…
ソース・プログラム 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 続行するには何…
ソース・プログラム 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…
これは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…
ソース・プログラム 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…
ソース・プログラム 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…
あんまりやる気もしないが、たまに暇つぶしに。 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) ==…
素数の総和は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…
テキトー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 …
ソース・プログラム program PEuler008 implicit none character(len = 1000) :: fig = & '73167176531330624919225119674426574742355349194934& &96983520312774506326239578318016984801869478851843& &858615607891129494954595017379583319528532088055…
ガウスの素数定理によって大体の値の見当をつけてそこまでの素数をやや大目に求めます。 ソース・プログラム program PEuler007 implicit none integer, parameter :: np = 10001 integer, allocatable :: iptab(:) integer :: n ! np ~ n / log(n) ! approx…