{--------------------------------------------------------------------- - Subiect: Bunica mea are un ceas cu cuc care canta la ore fixe (de numarul de ori egal cu ora) si la "si jumatate" (o singura data). Pe ceasul bunicii orele sunt numerotate de la 1 la 12. Eu am plecat de acasa exact dupa ce cucul a cantat de ora fixa si am lipsit cel putin o ora. Dupa ce m-am intors, cucul a cantat de "si jumatate" si bunica suparata mi-a spus "De cand ai plecat, cucul a canat de k ori!" - Cerinta: Fiindca nu inteleg de ce bunica mea e asa de suparata, scrieti un program care sa determine numarul minim de ore ce am lipsit de acasa! ---------------------------------------------------------------------} Program Cucul ; uses crt ; const max_cuc = 1000000000 ; var P, L, k: longint ; k_calc, L_min, P_: longint ; function Sn(m, n: integer): longint ; begin Sn := (n-m+1) * (n+m) div 2 ; end ; function Cucu_12: word ; begin Cucu_12 := Sn(1, 12) + 12 ; end ; function k_(P, L: Word): longint ; var rez: longint ; begin rez := Cucu_12 * (L div 12) ; L := L mod 12 ; while L > 0 do begin dec(L) ; P := P mod 12 + 1 ; inc(rez, 1 + P) ; end ; k_ := rez ; end ; BEGIN clrscr ; WriteLn('Daca lipseam 12 ore, cucu canta de ', Cucu_12, ' ori!'#10) ; Write('De cate ori a cantat cucul? ') ; ReadLn(k) ; P_ := 0 ; L_min := 12 * (k div Cucu_12) ; if L_min = 0 then L_min := 1; for P := 1 to 12 do begin L := L_min ; repeat k_calc := k_(P, L) ; if k_calc = k then if L <= L_min then begin L_min := L ; P_ := P ; Break ; end ; inc(L) ; until not( (0 < k_calc)and(k_calc < max_cuc)and(k_calc <= k) ) ; end ; if P_ <> 0 then WriteLn('Am iesit din casa la ora ', P_:2, ' si am lipsit ', L_min:2, ' ore.') else WriteLn('Nu am iesit din casa...'); readkey ; END.