Untuk menjawab soal pemrograman, perhatikan beberapa hal berikut:
Diberikan suatu persoalan, dan Anda diminta menuliskan program komputer dengan menggunakan pseudopascal atau bahasa pemrograman Pascal, C, atau C++.
Program komputer atau pseudopascal yang ditulis harus dapat menghasilkan output yang diminta dengan batasan yang sudah ditentukan.
Setiap persoalan terdiri atas deskripsi soal, batasan (waktu eksekusi, input, dan output), contoh input, dan contoh output.
JUMLAH DERET
Deskripsi:
Pada suatu hari, Pak Dengklek menemukan suatu pola penjumlahan dari N bilangan berikut:
1/3 + 2/21 + 3/91 + 4/273 + ...
Dengan menggunakan kalkulator, Pak Dengklek mulai menghitung. Untuk N=1, dihitung 1/3=0.33333. Untuk N=2, dihitung 1/3+2/21=0.42857. Nah, Pak Dengklek mulai pusing jika menghitung untuk N=1000000 (satu juta). Untuk itu, Pak Dengklek minta bantuan Anda membuatkan program menghitung deret tersebut.
Batasan:
Waktu eksekusi: 1 detik
Input: Input berupa sebuah bilangan bulat N dengan batasan 1<N<107.
Contoh Input:
5
Contoh Output:
0.48387
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
Cara 1 :
Karena di soal nggak dijelasin rumus aslinya Un kayak gimana, kita coba asumsi rumus Un :
Di soal dibilang 1 detik = 10^3 operasi, jadi kalo kita coba loop dari 1 sampai n, pada kasus terburuknya kita bakal loop ~10^7 kali -> TLE.
Sekarang, kita coba jadiin deret teleskopik (coba mainin Un dulu) :
Coba kita liat U1, U2, U3, U4, …, Un :
Kalo kita jumlahin dari atas ke bawah, yang ditengah-tengah itu bakal ilang (udah keliatan kan teleskopiknya?). Sisanya :
Yaudah. Tinggal bikin programnya aja. Contoh kode :
#include <cstdio>
int main() {
long long n;
scanf("%lld", &n);
double res = (1.0 - 1.0 / (n * (n + 1) + 1)) / 2;
printf("%.5lf\n", res);
return 0;
}
Output di ideone : http://ideone.com/e4Fdky
Cara 2 :
Perhatikan bahwa nilai dari U1001 sampai U10000000 udah kecil banget, dan kalo dijumlah semua gak akan mempengaruhi jawaban. Jadi, banyaknya operasi bisa dibatasin sampe 1000, sehingga waktu eksekusi program masih dalam time limit.
Kode :
#include <cstdio>
int main() {
long long n;
scanf("%lld", &n);
double res = 0;
for (long long i = 1; i <= n; i++) {
if (i > 1000) {
break;
}
double t = 1.0 / (i*i*i*i + i*i + 1);
res += t;
}
printf("%.5lf\n", res);
return 0;
}
Kayaknya cara ini bukan yang diharapkan....
Walaupun outputnya benar, di awal bakal susah ngeyakinin bahwa untuk n = 1000 sampe n = 10000000 jawabannya nggak berubah. Mungkin bisa dengan nunjukkin nilai dari (U1 + U2 + ... + U1000) = sesuatu (5 angka belakang koma), abis itu tunjukkin juga nilai dari (U1 + U2 + ... + U10000) = sesuatu yang sama (5 angka belakang koma) dengan rumus yang ada di cara 1.
Bukti bahwa nilainya nggak berubah : http://ideone.com/Xcu6iQ
Masuk untuk menulis jawaban
Tidak ada tuhan selain Allah
ribet amat
nih ane kasih cara simple nya
agan tinggal pake rumus SN aja gan yang di aritmatika
yang N/2(a+un)
cari dulu baris deret nya
disitu kan ada 3 21 91 273
jabarin
jadi :
1x3 = 3
3x7= 21
7x13= 91
13x21=273
nah ada polanya kan
1 3 7 13 pake rumus (n2-n+1)
3 7 13 21 pake rumus (n2+n+1)
udah ketemu baru
masukin ke rumus sn
SN = n/2(a+un)
un nya jadi = n/(n2-n+1)(n2+n+1)
a = 1/3
jadi kalo di program ya kaya gini

\
BERES
Ini pake deret tk.2 klw mau tau lbh lanjut tanya lewat FB aja https://www.facebook.com/elshaddy03
rumua deretnya (n^2-n+1)*(n^2+n+1)
program deret;
uses sysutils;
var
angka: string;
n: integer;
function deret(x:integer):extended; {extended = real terpanjang, kan kita butuh sampai 1juta}
var {buat jaga" aja, kalau diganti jadi real akan hemat memory(RAM)}
y, z:integer;
a: extended;
begin
z:=0;
a:=0;
for y:=x downto 1 do
begin
z:=(y*y-y+1)*(y*y+y+1);
write(y, '/', z, '+');
a:=a+y/z;
end;
write('0 = ');
deret:=a;
end;
begin
while true do
begin
readln(angka);
Try
n:= StrToInt(angka);
ERROR if (0
writeln(); {Ini dia kelemahannya, kan batas waktu eksekusinya 1 detik tuh}
writeln(deret(n):0:5); {nah kalo udah begitu, hapus aja bagian write() nya mudah kan}
end;
except
on exception do writeln('Maaf, mohon coba lagi');
end;
end;
end.
Compile saja. Thanks @BimaSatria untuk rumus deretnya

NB: Output program TIDAK SESUAI yang diminta soal, maka ubahlah!
NBB: Ganti baris yang error jadi if (0<n) and (n<1000001) then begin duh gak bisa diganti lagi yg, diatas
Beda compiler, coba jadikan huruf besar atau huruf kecil semua. -> TRY atau try
Maaf, saya menggunakan Lazarus IDE, untuk fpc, gunakan switch -s2, jadi seperti: fpc -Sd fibo.pas
EDIT: gunakan switch -sd
Maaf, maksud saya -Sd , S besar.
Duh harap maklum ya, jarang menggunakan fpc
Aku coba kok programnya tidak bisa jalan? Mohon bimbingannya.
Errornya bisa diatasi dengan mudah kok;
Itu saya copy ke sininya ada yang kehapus.
kalau gini bener atau salah?
program deret;
var a,b,n:longint;
e,j:extended;
begin
readln(n);
for a:= n downto 1 do
begin
b:= (a*a-a+1)*(a*a+a+1);
j:= a/b;
e:=e+j;
end;
writeln(e:0:5);
readln;
end.
program osp2014_49;
var
n, a, b, i, c: longint;
ans: extended;
begin
while not EOF do
begin
readln(n);
ans := 0;
a := 1;
b := 1;
c := 2;
i := 0;
while i < n do
begin
ans := ans + a / (b * (b + c));
a := a + 1;
b := b + c;
c := c + 2;
Inc(i);
writeln(a, b);
end;
writeln(ans: 0: 5);
end;
end.
var
n,a,b:longint;
c:double;
begin
readln(n);
a:=n*n+n;
b:=2*(n*n+n+1);
c:=a/b;
writeln(c:0:5);
end.
rumus Sn pembilangnya (n(n+1)/2);
sedangkan rumus penyebutnya(n^2+n+1);
rumus deretnya nya n/n^4+n^2+1
CMIIW
Be Grateful ..!!
identifier not found "TRY"