samedi 4 avril 2020

sum multiples in a given range

well I want to sum up the multiples of 3 and 5. Not too hard if I want just the sum upon to a given number, e.g. -> up to 60 the sum is 870.

But what if I want just the first 15 multiples?

well one way is

void summation (const unsigned long number_n, unsigned long &summe,unsigned int &counter );
void summation (const unsigned long number_n, unsigned long &summe,unsigned int &counter )
{

       unsigned int howoften = 0;
       summe = 0;
       for( unsigned long i = 1; i <=number_n; i++ )
           if (howoften <= counter-1)
           {
               if( !( i % 3 ) || !( i % 5 ) )
               {
                   summe += i;
                   howoften++;
               }
           }
       counter = howoften;



   return;
}

But as expected the runtime is not accceptable for a counter like 1.500.000 :-/

Hm I tried a lot of things but I cannot find a solution by my own.

I also tried a faster summation algorithm like (dont care bout overflow at this point):

int sum(int N);
int sum(int N)
{
    int S1, S2, S3;

    S1 = ((N / 3)) * (2 * 3 + (N / 3 - 1) * 3) / 2;
    S2 = ((N / 5)) * (2 * 5 + (N / 5 - 1) * 5) / 2;
    S3 = ((N / 15)) *(2 * 15 + (N / 15 - 1) * 15) / 2;

    return S1 + S2 - S3;
}

or even

unsigned long sum1000 (unsigned long target);
unsigned long sum1000 (unsigned long target)
{
   unsigned int summe = 0;
   for (unsigned long i = 0; i<=target; i+=3) summe+=i;
   for (unsigned long i = 0; i<=target; i+=5) summe+=i;
   for (unsigned long i = 0; i<=target; i+=15) summe-=i;
return summe;

}

But I'm not smart enough to set up an algorithm which is fast enough (I say 5-10 sec. are ok)

The whole sum of the multiples is not my problem, the first N multiples are :)

Thanks for reading, and if u have any ideas, it would be great

Aucun commentaire:

Enregistrer un commentaire