Credo di aver trovato una soluzione generale con complessità O(1)
codice:
int sum2(int k,int n)
{
k = (k+1)/2 *2;
n = (n)/2 *2;
if(k>n)
return 0;
int tot = ((n + k) * ((n -k)/2 +1))/2;
return tot;
}
Non l'ho testata assiduamente ma dovrebbe essere corretta.
Un programmino di test
codice:
#include <stdio.h>
int sum(int k,int n);
int sum2(int k,int n);
int main ()
{
int p = 6;
printf("La somma O(n) e':\n");
for(int i = p; i <= 130;i++)
printf("%d ", sum(p,i));
printf("\n\nLa somma O(1) e':\n");
for(int i = p; i <= 130;i++)
printf("%d ", sum2(p,i));
return 0;
}
int sum(int k,int n)
{
int num;
int tot = 0;
for (num=k;num<=n;num++)
{
if (num % 2 == 0)
{
tot = tot + num;
}
}
return tot;
}
int sum2(int k,int n)
{
k = (k+1)/2 *2;
n = (n)/2 *2;
if(k>n)
return 0;
int tot = ((n + k) * ((n -k)/2 +1))/2;
return tot;
}