Sayfalar

1 Şubat 2018

Euler Projesi 235. Soru

Bir Aritmetik Geometrik Dizi


Aritmetik-geometrik u(k) = (900-3k)rk-1 dizisi verilsin.
s(n) = Σk = 1 ... nu(k) olsun.

s(5000) = -600.000.000.000 için r değerini bulunuz.

Cevabınızı 12 ondalık basamağa göre yuvarlayınız.

Cevap: 1,002322108633

Python:
def s(r):
    return sum((900-3*k)*r**(k-1) for k in range(1, 5001))

for i in range(10):
    r = 1.002322108632 + i * 10 ** -13
    print(format(r, '.13f'), format(s(r), '13f'))
 
C++:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <memory.h>
#include <string.h>
#include <time.h>

struct timer
{
   clock_t t;
   timer() { t = clock(); }
   ~timer() { printf("runtime %.3f secs\n", getTime()); }
   double getTime() { return ((double)clock()-(double)t)/(double)CLOCKS_PER_SEC; }
};

void fx()
{
   double N=200000000000, r=1.01, pr, diff=(r-1)/2;
   while (pr=r, diff != 0)
   {
      double rx=1, rt=0;
      int i=0;
      while (++i<=5000)
         rt-=(300-i)*rx, rx=rx*r;
      if (rt>N)
         r-=diff, diff=(pr-r)/2;
      else if (rt<N)
         r+=diff, diff=(r-pr)/2;
   }
   printf("found=%.12f\n",r);
}
int main(int ac, char** av)
{
   timer t;
   fx();
   return 0;
}
 
Ruby:
def u(r, k)
  (900-3*k)*(r**(k-1))
end

def s(r, n)
  sum = 0
  (1..n).each {|k| sum += u(r, k)}
  sum
end

r = 1
delta = 0.1
max =  -6*10**11

precision = 12
while precision > 0 do
  r += delta
  res = s(r, 5000)
  p r
  if res < max then
    r -= delta
    delta /= 10
    precision -= 1
  end
end
 
Perl:
sub U
{
  my $r = $_[0];
  my $n = 5000;
  my $retU = 0;
  for $k ( 1 .. $n ) {$retU +=(900-(3*$k))*($r**($k-1))}
  return $retU;
}

$goal = -600000000000;
$r = 1;
$inc = .01;
$side = "-";
while (abs($inc)> 0.0000000000001)
{
  $ans = U $r;
  if (($ans < $goal) && ($side eq "-"))
  {
    $inc = - $inc/10;
    $side = "+";
  }
  if (($ans > $goal) && ($side eq "+"))
  {
    $inc = - $inc/10;
    $side = "-";
  }
  $r += $inc;
}
print $r\n;