Toster Napisano Czerwiec 20, 2011 Zgłoś Share Napisano Czerwiec 20, 2011 Tak mnie naszło z nienacka, piszę już któryś raz z kolei prockę która jest dosyć prosta i za każdym razem mam dylemat jak ją napisać Jak się komuś będzie nudziło to niech sobie rozwiąże takie proste zagadnienie: Zakładamy dla uproszczenia że mamy tablicę 6 elementową typu float/real. W tej tablicy mamy jakieś tam wartości >=0. Napisać funkcję która przyjmuje na wejściu wartość x, a powinna zwrócić wartość y taką że jest przy obliczaniu y należy równomiernie pomniejszyć wszystkie komórki tablicy, i zwrócić sumę. Może przykład tablica A=[2,2,1,4,4] Wywołanie foo(6) return 6 A po wywołaniu [1, 1, 0, 3, 3] drugie wywolanie foo(6) return 6 A po wywołaniu [0, 0, 0, 1, 1] trzecie wywolanie foo(6) return 2 A po wywołaniu [0, 0, 0, 0, 0] prawda że proste ? :> Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
TSr Napisano Czerwiec 20, 2011 Zgłoś Share Napisano Czerwiec 20, 2011 W jaki sposób pomniejszana jest tablica? Zwracana jest suma elementów tablicy, ale nie więcej niż x? Ubuntu.pl user #10593 Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 20, 2011 Autor Zgłoś Share Napisano Czerwiec 20, 2011 Ma być zwrócone nie więcej niż X, ale w miarę możliwości pobrane równomiernie ze wszystkich elementów tablicy. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
TSr Napisano Czerwiec 20, 2011 Zgłoś Share Napisano Czerwiec 20, 2011 Czy takie wywołanie jest poprawne gdy elementy tablicy dzielone są przez np. 2? Nie kapuję tego pomniejszania. tablica A=[2,2,1,4,4] Wywołanie foo(6) return 6 A po wywołaniu [1, 1, 0.5, 2, 2] Wywołanie foo(6) return 6 A po wywołaniu [0.5, 0.5, 0.25, 1, 1] Wywołanie foo(6) return 3.25 A po wywołaniu [0.25, 0.25, 0.125, 0.5, 0.5] ... Ubuntu.pl user #10593 Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 20, 2011 Autor Zgłoś Share Napisano Czerwiec 20, 2011 chodzi aby równomiernie pomniejszać wartości po całej "szerokości" tablicy. Czyli jak masz [2, 2, 1, 4, 4] i chcesz ściągnąć z tego 6 to defacto powinieneś z każdego ściągnąć 1/6 wartości. czyli 6 * 1/6 = 1 obniżasz ze wszystkich o 1 teraz idąc dalej masz [1, 1, 0, 3, 3] chcesz znowu ściągnąć 6, i tutaj już jest kilka wariantów. bo w tablicy masz tylko 5 wartości > 0, czyli powinieneś ściągnąć 6 * 1/5 = 1,2 ale dwa pierwsze pola mają tylko 1 czyli po wykonaniu operacji tablica będzie mieć [0, 0, 0, 1.8, 1.8] tylko że zamiast 6 zebrałeś (1 + 1 + 1.2 + 1.2) = 4.4 no i brakuje ci 1.6, a te 1.6 jest dostępne ciągle więc wychodzi że musisz ściągnąć jeszcze 1.6 z 2 elementów czyli po 0.8. Sumarycznie na wyniku będzie więc [0, 0, 0, 1, 1] Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
LordLost Napisano Czerwiec 20, 2011 Zgłoś Share Napisano Czerwiec 20, 2011 Nie wiem czy o to chodzi? t[n]:= t[n]-t[n]*x/suma elementów; Tablica[2,2,1,4,4] Wywołanie foo(6) return 6 Tablica[1.08, 1.08, 0.54, 2.15, 2.15] Wywołanie foo(6) return 6 Tablica[0.15, 0.15, 0.08, 0.31, 0.31] Wywołanie foo(6) return 6 Tablica[-0.75, -0.75, -0.4, -1.55, -1.55] // Ten wzór się nie sprawdza jeśli x > sumy elementów (potrzebny dodatkowy warunek) Edit: Mój błąd, miało być równomiernie a wyszło proporcjonalnie Edit2: Toster wyżej napisałeś chyba jedyne rozwiązanie t[n]:= t[n]-x(1/IlośćElementów>0) i resztę rozdzielać na pozostałe elementy>0 dopóki x=y, lub suma elementów:= 0}, każde inne rozwiązanie nie będzie chyba równomiernie odejmować. Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 20, 2011 Autor Zgłoś Share Napisano Czerwiec 20, 2011 LordLost twoj algorytm nie sciaga rownomiernie z calej tablicy. Pobiera wiecej z pol ktore maja wieksza calosc, no i schodzi z wartosciami ponizej 0. a wyniak mial byc >=0 Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.