Credo di aver trovato una soluzione generale con complessità O(1)
Non l'ho testata assiduamente ma dovrebbe essere corretta.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; }
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; }

Rispondi quotando