Saya ingin algoritme atau kode yang sangat cepat dalam C melakukan tugas berikut: menjumlahkan semua angka dari 1 hingga N untuk bilangan bulat N tertentu, tanpa berasumsi N positif. Saya membuat perulangan dengan penjumlahan dari 1 hingga N, tetapi terlalu lambat.
Algoritme tercepat untuk menjumlahkan angka hingga N [ditutup]
Jawaban (8)
Jika N
positif: int sum = N*(N+1)/2;
Jika N
negatif: int tempN = -N; int sum = 1 + tempN*(tempN+1)/2 * (-1);
.
+ 1
di akhir. 1 + 0 + -1 + -2 = -2, bukan -3.
- person tloflin; 12.04.2010
>> 1
).
- person erikkallen; 12.04.2010
N/2
menemukan nilai rata-rata semua angka antara 0 dan N. Kita mulai dari 1, jadi ubah ke (N+1)/2
. Sekarang kita sudah mempunyai nilai rata-ratanya, kita hanya perlu mengalikannya dengan banyaknya nilai pada barisan (N) (sebenarnya N-1(nilai awal)+1(1 sampai 2 berisi 2 nilai, bukan 2-1=1 ), tetapi N-1+1=N). Jadi N*((N+1)/2)
, dikurangi = N*(N+1)/2
.
- person Ponkadoodle; 13.04.2010
Rumus yang Anda cari adalah bentuk yang lebih umum dari rumus yang diposting di beberapa jawaban atas pertanyaan Anda, yaitu Deret/Perkembangan Aritmatika dengan faktor selisih 1. Dari Wikipedia, berikut ini:
Rumus di atas akan menangani bilangan negatif selama m selalu lebih kecil dari n. Misalnya untuk mendapatkan jumlah dari 1 sampai -2, setel m ke -2 dan n ke 1, yaitu jumlah dari -2 ke 1. Melakukan hal ini akan menghasilkan:
(1 - -2 + 1) * (1 + -2) / 2 = 4 * -1 / 2 = -4 / 2 = -2.
itulah hasil yang diharapkan.
Untuk melengkapi jawaban di atas, beginilah cara Anda membuktikan rumusnya (contoh untuk bilangan bulat positif tetapi prinsipnya sama untuk bilangan negatif atau rangkaian aritmatika apa pun seperti yang ditunjukkan oleh Void).
Cukup tulis suite dua kali seperti di bawah ini dan tambahkan angka:
1+ 2+ 3+ ... n-2+ n-1+ n = sum(1..n) : n terms from 1 to n
+ n+ n-1+ n-2+ ... 3+ 2+ 1 = sum(n..1) : the same n terms in reverse order
--------------------------------
n+1+ n+1+ n+1+ ... n+1+ n+1+ n+1 = 2 * sum(1..n) : n times n+1
n * (n+1) / 2 = sum(1..n)
Untuk menangani integer overflow saya akan menggunakan fungsi berikut:
sum = (N%2) ? ( ((N+1)/2)*N ) : ( (N/2)*(N+1) );
Coba ini...
Dimana n adalah bilangan bulat maksimum yang perlu Anda jumlahkan.
Jumlahnya adalah (n*(N+1))/2
Pernahkah Anda mendengar tentang urutan & deret? Kode 'cepat' yang anda inginkan adalah penjumlahan deret aritmatika dari 1 sampai N .. google saja .. langsung buka buku matematika anda ..
jika |n| cukup kecil, tabel pencarian akan menjadi yang tercepat.
atau menggunakan cache, cari terlebih dahulu cache tersebut, jika tidak dapat menemukan record maka kalkulasikan penjumlahannya dengan menggunakan n * (n + 1) / 2 (jika n positif), dan catat hasilnya ke dalam cache.
O(log N)
, kecuali Anda membatasi nilai N
, dalam hal ini loop naifnya juga O(1)
.
- person avakar; 12.04.2010
O(log N)
benar-benar ada? Wikipedia tidak mencantumkan apa pun: en.wikipedia.org/wiki/
- person erikkallen; 13.04.2010
log N
, seharusnya tertulis \Omega(log N)
.
- person avakar; 13.04.2010
O(log N log log N log log log N)
ini
- person erikkallen; 13.04.2010