Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]sumowanie liczb
Forum PHP.pl > Forum > PHP
MaciekDZN
witam, mam ciekawy problem, szukałem na forum ale nic nie moglem znaleźć sad.gif

a więc tak:
mam pewną ilość liczb w bazie danych
np.
1346
1650
5645
3643
2346
7554
3457
765

skrypt ma za zadanie sumować pokolei liczby do momentu aż wynik wyniesie np. 1000 lub 2000 lub 3000 aż do 10000, gdy wynik będzie większy niż 10000 to wtedy zaczyna sumować liczy od początku tylko że od następnej liczby czyli jak mamy
1346+1650=2996
1346+1650+5645=8641
1346+1650+5645+3643=12284
i zaczyna od nowa ale już od liczby 1650
1650+5645=7295
itd... aż do momentu gdy suma licz będzie równa 1000 lub jego wielokrotności to wtedy zacznie znowu od następnej liczby

ew. może też być suma każdej liczby z każdą

napisałem coś w podobnego ale mój skrypt ma wiele wad

  1. <?php
  2.  
  3. function wygral($wynik1)
  4. {
  5. if($wynik1==1000)
  6. echo "<b>Wygrales 1000</b><br>";
  7. if($wynik1==2000)
  8. echo "<b>Wygrales 2000</b><br>";
  9. if($wynik1==3000)
  10. echo "<b>Wygrales 3000</b><br>";
  11. if($wynik1==4000)
  12. echo "<b>Wygrales 4000</b><br>";
  13. if($wynik1==5000)
  14. echo "<b>Wygrales 5000</b><br>";
  15. if($wynik1==6000)
  16. echo "<b>Wygrales 6000</b><br>";
  17. if($wynik1==7000)
  18. echo "<b>Wygrales 7000</b><br>";
  19. if($wynik1==8000)
  20. echo "<b>Wygrales 8000</b><br>";
  21. if($wynik1==9000)
  22. echo "<b>Wygrales 9000</b><br>";
  23. if($wynik1==10000)
  24. echo "<b>Wygrales 10000</b><br>";
  25. }
  26.  
  27. function czy_wygral($l1, $l2, $l3, $l4, $l5, $l6, $l7)
  28. {
  29. //1111111111111111111111111111111
  30. if($l1>0 and $l2>0)
  31. {
  32. $wynik1=$l1+$l2;
  33. echo "$l1+$l2=$wynik1<br>";
  34. wygral($wynik1);
  35. }
  36.  
  37. if($l1>0 and $l2>0 and $l3>0)
  38. {
  39. $wynik1=$l1+$l2+$l3;
  40. echo "$l1+$l2+$l3=$wynik1<br>";
  41. wygral($wynik1);
  42. }
  43.  
  44. if($l1>0 and $l2>0 and $l3>0 and $l4>0)
  45. {
  46. $wynik1=$l1+$l2+$l3+$l4;
  47. echo "$l1+$l2+$l3+$l4=$wynik1<br>";
  48. wygral($wynik1);
  49. }
  50.  
  51. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l5>0)
  52. {
  53. $wynik1=$l1+$l2+$l3+$l4+$l5;
  54. echo "$l1+$l2+$l3+$l4+$l5=$wynik1<br>";
  55. wygral($wynik1);
  56. }
  57.  
  58. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0)
  59. {
  60. $wynik1=$l1+$l2+$l3+$l4+$l5+$l6;
  61. echo "$l1+$l2+$l3+$l4+$l5+$l6=$wynik1<br>";
  62. wygral($wynik1);
  63. }
  64.  
  65. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0 and $l7>0)
  66. {
  67. $wynik1=$l1+$l2+$l3+$l4+$l5+$l6+$l7;
  68. echo "$l1+$l2+$l3+$l4+$l5+$l6+$l7=$wynik1<br>";
  69. wygral($wynik1);
  70. }
  71.  
  72.  
  73.  
  74. //2222222222222222222222222222222 bez 1
  75. if($l2>0 and $l3>0)
  76. {
  77. $wynik1=$l2+$l3;
  78. echo "$l2+$l3=$wynik1<br>";
  79. wygral($wynik1);
  80. }
  81.  
  82. if($l2>0 and $l3>0 and $l4>0)
  83. {
  84. $wynik1=$l2+$l3+$l4;
  85. echo "$l2+$l3+$l4=$wynik1<br>";
  86. wygral($wynik1);
  87. }
  88.  
  89. if($l2>0 and $l3>0 and $l4>0 and $l5>0)
  90. {
  91. $wynik1=$l2+$l3+$l4+$l5;
  92. echo "$l2+$l3+$l4+$l5=$wynik1<br>";
  93. wygral($wynik1);
  94. }
  95.  
  96. if($l2>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0)
  97. {
  98. $wynik1=$l2+$l3+$l4+$l5+$l6;
  99. echo "$l2+$l3+$l4+$l5+$l6=$wynik1<br>";
  100. wygral($wynik1);
  101. }
  102.  
  103. if($l2>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0 and $l7>0)
  104. {
  105. $wynik1=$l2+$l3+$l4+$l5+$l6+$l7;
  106. echo "$l2+$l3+$l4+$l5+$l6+$l7=$wynik1<br>";
  107. wygral($wynik1);
  108. }
  109.  
  110.  
  111.  
  112. //3333333333333333333333333333333 bez 1,2
  113. if($l3>0 and $l4>0)
  114. {
  115. $wynik1=$l3+$l4;
  116. echo "$l3+$l4=$wynik1<br>";
  117. wygral($wynik1);
  118. }
  119.  
  120. if($l3>0 and $l4>0 and $l5>0)
  121. {
  122. $wynik1=$l3+$l4+$l5;
  123. echo "$l3+$l4+$l5=$wynik1<br>";
  124. wygral($wynik1);
  125. }
  126.  
  127. if($l3>0 and $l4>0 and $l5>0 and $l6>0)
  128. {
  129. $wynik1=$l3+$l4+$l5+$l6;
  130. echo "$l3+$l4+$l5+$l6=$wynik1<br>";
  131. wygral($wynik1);
  132. }
  133.  
  134. if($l3>0 and $l4>0 and $l5>0 and $l6>0 and $l7>0)
  135. {
  136. $wynik1=$l3+$l4+$l5+$l6+$l7;
  137. echo "$l3+$l4+$l5+$l6+$l7=$wynik1<br>";
  138. wygral($wynik1);
  139. }
  140.  
  141.  
  142.  
  143. //4444444444444444444444444444444 bez 1,2,3
  144. if($l4>0 and $l5>0)
  145. {
  146. $wynik1=$l4+$l5;
  147. echo "$l4+$l5=$wynik1<br>";
  148. wygral($wynik1);
  149. }
  150.  
  151. if($l4>0 and $l5>0 and $l6>0)
  152. {
  153. $wynik1=$l4+$l5+$l6;
  154. echo "$l4+$l5+$l6=$wynik1<br>";
  155. wygral($wynik1);
  156. }
  157.  
  158. if($l4>0 and $l5>0 and $l6>0 and $l7>0)
  159. {
  160. $wynik1=$l4+$l5+$l6+$l7;
  161. echo "$l4+$l5+$l6+$l7=$wynik1<br>";
  162. wygral($wynik1);
  163. }
  164.  
  165.  
  166.  
  167. //5555555555555555555555555555555 bez 1,2,3,4
  168. if($l5>0 and $l6>0)
  169. {
  170. $wynik1=$l5+$l6;
  171. echo "$l5+$l6=$wynik1<br>";
  172. wygral($wynik1);
  173. }
  174.  
  175. if($l5>0 and $l6>0 and $l7>0)
  176. {
  177. $wynik1=$l5+$l6+$l7;
  178. echo "$l5+$l6+$l7=$wynik1<br>";
  179. wygral($wynik1);
  180. }
  181.  
  182.  
  183. //6666666666666666666666666666666 bez 1,2,3,4,5
  184. if($l6>0 and $l7>0)
  185. {
  186. $wynik1=$l6+$l7;
  187. echo "$l6+$l7=$wynik1<br>";
  188. wygral($wynik1);
  189. }
  190.  
  191. //1111111111111111111111111111111 bez 2
  192. if($l1>0 and $l3>0)
  193. {
  194. $wynik1=$l1+$l3;
  195. echo "$l1+$l3=$wynik1<br>";
  196. wygral($wynik1);
  197. }
  198.  
  199. if($l1>0 and $l3>0 and $l4>0)
  200. {
  201. $wynik1=$l1+$l3+$l4;
  202. echo "$l1+$l3+$l4=$wynik1<br>";
  203. wygral($wynik1);
  204. }
  205.  
  206. if($l1>0 and $l3>0 and $l4>0 and $l5>0)
  207. {
  208. $wynik1=$l1+$l3+$l4+$l5;
  209. echo "$l1+$l3+$l4+$l5=$wynik1<br>";
  210. wygral($wynik1);
  211. }
  212.  
  213. if($l1>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0)
  214. {
  215. $wynik1=$l1+$l3+$l4+$l5+$l6;
  216. echo "$l1+$l3+$l4+$l5+$l6=$wynik1<br>";
  217. wygral($wynik1);
  218. }
  219.  
  220. if($l1>0 and $l3>0 and $l4>0 and $l5>0 and $l6>0 and $l7>0)
  221. {
  222. $wynik1=$l1+$l3+$l4+$l5+$l6+$l7;
  223. echo "$l1+$l3+$l4+$l5+$l6+$l7=$wynik1<br>";
  224. wygral($wynik1);
  225. }
  226.  
  227. //1111111111111111111111111111111 bez 3
  228. if($l1>0 and $l2>0 and $l4>0)
  229. {
  230. $wynik1=$l1+$l2+$l4;
  231. echo "$l1+$l2+$l4=$wynik1<br>";
  232. wygral($wynik1);
  233. }
  234.  
  235. if($l1>0 and $l2>0 and $l4>0 and $l5>0)
  236. {
  237. $wynik1=$l1+$l2+$l4+$l5;
  238. echo "$l1+$l2+$l4+$l5=$wynik1<br>";
  239. wygral($wynik1);
  240. }
  241.  
  242. if($l1>0 and $l2>0 and $l4>0 and $l5>0 and $l6>0)
  243. {
  244. $wynik1=$l1+$l2+$l4+$l5+$l6;
  245. echo "$l1+$l2+$l4+$l5+$l6=$wynik1<br>";
  246. wygral($wynik1);
  247. }
  248.  
  249. if($l1>0 and $l2>0 and $l4>0 and $l5>0 and $l6>0 and $l7>0)
  250. {
  251. $wynik1=$l1+$l2+$l4+$l5+$l6+$l7;
  252. echo "$l1+$l2+$l4+$l5+$l6+$l7=$wynik1<br>";
  253. wygral($wynik1);
  254. }
  255.  
  256. //1111111111111111111111111111111 bez 4
  257. if($l1>0 and $l2>0 and $l3>0 and $l5>0)
  258. {
  259. $wynik1=$l1+$l2+$l3+$l5;
  260. echo "$l1+$l2+$l3+$l5=$wynik1<br>";
  261. wygral($wynik1);
  262. }
  263.  
  264. if($l1>0 and $l2>0 and $l3>0 and $l5>0 and $l6>0)
  265. {
  266. $wynik1=$l1+$l2+$l3+$l5+$l6;
  267. echo "$l1+$l2+$l3+$l5+$l6=$wynik1<br>";
  268. wygral($wynik1);
  269. }
  270.  
  271. if($l1>0 and $l2>0 and $l3>0 and $l5>0 and $l6>0 and $l7>0)
  272. {
  273. $wynik1=$l1+$l2+$l3+$l5+$l6+$l7;
  274. echo "$l1+$l2+$l3+$l5+$l6+$l7=$wynik1<br>";
  275. wygral($wynik1);
  276. }
  277.  
  278. //1111111111111111111111111111111 bez 5
  279. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l6>0)
  280. {
  281. $wynik1=$l1+$l2+$l3+$l4+$l6;
  282. echo "$l1+$l2+$l3+$l4+$l6=$wynik1<br>";
  283. wygral($wynik1);
  284. }
  285.  
  286. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l6>0 and $l7>0)
  287. {
  288. $wynik1=$l1+$l2+$l3+$l4+$l6+$l7;
  289. echo "$l1+$l2+$l3+$l4+$l6+$l7=$wynik1<br>";
  290. wygral($wynik1);
  291. }
  292.  
  293. //1111111111111111111111111111111 bez 6
  294. if($l1>0 and $l2>0 and $l3>0 and $l4>0 and $l5>0 and $l7>0)
  295. {
  296. $wynik1=$l1+$l2+$l3+$l4+$l5+$l7;
  297. echo "$l1+$l2+$l3+$l4+$l5+$l7=$wynik1<br>";
  298. wygral($wynik1);
  299. }
  300. //
  301. }
  302.  
  303. $liczba[1] = 1023;
  304. $liczba[2] = 423;
  305. $liczba[3] = 2345;
  306. $liczba[4] = 261;
  307. $liczba[5] = 3055;
  308. $liczba[6] = 1894;
  309. $liczba[7] = 106;
  310. $liczba[8] = 25;
  311. $liczba[9] = 2075;
  312. $liczba[10] = 1001;
  313. $liczba[11] = 999;
  314. $liczba[12] = 56;
  315. $liczba[13] = 999;
  316. $liczba[14] = 999;
  317. $liczba[15] = 1;
  318. $liczba[16] = 500;
  319. $liczba[17] = 4500;
  320. $liczba[18] = 386;
  321. $liczba[19] = 4607;
  322. $liczba[20] = 4392;
  323. $liczba[21] = 1396;
  324. $liczba[22] = 914;
  325.  
  326. echo "Liczby które podales:<br>";
  327. for($u=1;$u<=22;$u++)
  328. {
  329. echo "$liczba[$u]<br>";
  330. }
  331. echo "<br><br>";
  332.  
  333. /////////////////////////
  334. //wy�wietlenie wyników://
  335. /////////////////////////
  336.  
  337. echo "NIżej wy�wietlš się sumy 2 kolejnych liczb<br>";
  338.  
  339. $q1=1;
  340. $q2=2;
  341. $q3=3;
  342. $q4=4;
  343. $q5=5;
  344. $q6=6;
  345. $q7=7;
  346.  
  347. for($t=0;$t<=22;$t++)
  348. {
  349. $q1=1+$t;
  350. $q2=2+$t;
  351. $q3=3+$t;
  352. $q4=4+$t;
  353. $q5=5+$t;
  354. $q6=6+$t;
  355. $q7=7+$t;
  356. if($q2>17)
  357. $q2=0;
  358. if($q3>22)
  359. $q3=0;
  360. if($q4>22)
  361. $q4=0;
  362. if($q5>22)
  363. $q5=0;
  364. if($q6>22)
  365. $q6=0;
  366. if($q7>22)
  367. $q7=0;
  368. czy_wygral($liczba[$q1],$liczba[$q2],$liczba[$q3],$liczba[$q4],$liczba[$q5],$liczba[$q6],$liczba[$q7]);
  369. $t=$t+6;
  370. }
  371.  
  372.  
  373. ?>

Zyx
Przyznam się szczerze, że ni cholery z Twojego kodu nie rozumiem smile.gif.

  1. $numbers = array(... ); // tablica z liczbami wejściowymi
  2. $sums = array(); // sumy
  3. $cnt = sizeof($numbers);
  4.  
  5. for($i = 0; $i < $cnt; $i++)
  6. {
  7. foreach($sums as $idx => &$sum)
  8. {
  9. $sum += $numbers[$i];
  10. if($sum % 1000 == 0)
  11. {
  12. echo 'Wygrałeś '.$sum;
  13. unset($sums[$idx]);
  14. }
  15. elseif($sum > 10000)
  16. {
  17. unset($sums[$idx]);
  18. }
  19. }
  20. $sums[] = $numbers[$i];
  21. }


O ile dobrze zrozumiałem, to ten kod będzie robił to, co chcesz. Ponieważ w pesymistycznym przypadku sumowane są wszystkie możliwe okna nad danym ciągiem liczb, uznałem, że nie ma sensu, aby komplikować kod cofaniem się w tablicy wyników o kupę pozycji. Zamiast tego od razu sumuję okna zaczynające się od wszystkich liczb naraz i natychmiast sprawdzam, czy w którymś z nich nie przekroczyliśmy 10000 lub nie osiągnęliśmy wielokrotności 1000. Jeśli tak się stało, to po prostu usuwamy takie okno z listy.
thek
Zyx... Albo ja już jestem 100 lat za murzynami, albo właśnie się dowiedziałem, że każdy fragment kodu w PHP domyślnie działa wielowątkowo i można sobie odpalać thread w dowolnym miejscu, nawet bez deklaracji tego, a interpreter sam sobie zgaduje kiedy należy to zrobić winksmiley.jpg
Jak na razie to kod wykonuje się sekwencyjnie i tak też będzie działał w tym wypadku, tak więc odpalanie masy instancji sum można sobie o kant d... roztrzasnąć winksmiley.jpg Poza tym nic nam nie da wyświetlenie wyniku okna, skoro "gubimy" informację w tym samym momencie o tym jaki indeks był "startowym" dla ciągu danych by moc określić jakie elementy składały się na sumę dającą wielokrotność 1000. Musimy przynajmniej ten element (jego indeks) startowy oznaczyć lub gdzieś przechować, a unset nam go przecież usunie. Inna sprawa, że w przypadku ostatnich elementów tablicy brak "zawinięcia", przez co tracimy możliwość dodania do ostatnich elementów tych z początku tablicy by ewentualnie wyłapać krotność. Czyli dla pewności sum prędzej coś w deseń:
  1. $sum += $numbers[($i+$cnt)%$cnt];
Ogólnie pomysł z oknami jest dobry i mi samemu się podoba, tyle że bym dodał tablicę przechowującą index i sumę oraz "rollover". Może więcej ciut operacji, ale myślę, że to pewniejsze ciut.

Inna sprawa, że tak naprawdę takimi działaniami tworzymy małą liczbę kombinacji spośród możliwych i mamy zbyt dużą szansę "przeoczyć" pasujące kombinacje. Prędzej powinno być "skakanie po węzłach" z zapamiętywaniem kombinacji węzłów. Trudno tak od razu podać gotowy kod, ale algorytm byłby następujący:
1. Weź pierwszy wolny element.
2. Dodaj do niego "następny".
3. Sprawdź czy wielokrotność 1000 a jeśli tak to zapisz id korzenia i "następnych"
4. Jeśli suma większa od 10.000 to wymień ten "następny" na najbliższy wolny.
5. Jeśli suma mniejsza niż 10.000 dodaj następny "wolny".
6. Idź do kroku 3
7. Jeśli "następny" doszedł do końca tablicy to wymień "następny" element w kroku 2.
8. Jeśli i on doszedł do końca to dopiero przesuń "korzeń" o 1 pozycje.
9. Gdy "korzeń" dojdzie do końca to koniec sprawdzania.

Tak więc zrobi się z tego tak naprawdę ostro rozjechany krzaczor sprawdzający wszystko jak popadnie winksmiley.jpg

EDIT: Dziewczyna mnie zirytowała więc siadłem na kompie i popełniłem ten rekurencyjny kod, by odreagować...

  1. $source = array(123,123,23,4,4564,464,467,624,5467,4567,533,1434,3455);
  2. $count = count( $source );
  3. $bulls_eye = array();
  4. function check( $src, $i, $cnt, $actual_sum, &$results, $string) {
  5. for($t=$i+1; $t<$cnt; $t++) {
  6. $temporary=$actual_sum+$src[$t];
  7. $new_string = $string.','.$t;
  8. if($temporary>10000)
  9. continue;
  10. elseif($temporary%1000==0)
  11. $results[] = array($new_string, $temporary);
  12. else
  13. check($src, $t, $cnt, $temporary, $results, $new_string);
  14. }
  15. };
  16.  
  17. for($i=0; $i<$count; $i++) {
  18. $temp0 = $source[$i];
  19. check( $source, $i, $count, $temp0, $bulls_eye, $i);
  20. }
  21. foreach($bulls_eye AS $k => $kombinacja) {
  22. $indexy = explode(',', $kombinacja[0] );
  23. $kwoty = array();
  24. foreach( $indexy AS $klucz )
  25. $kwoty[] = $source[ $klucz ];
  26. $kwoty = implode('+', $kwoty);
  27. $kwoty .= ' = '.$kombinacja[1];
  28. $bulls_eye[$k] = $kwoty;
  29. }
  30. var_dump($bulls_eye);
W $bulls_eye masz wyniki, $src to Twoje kupony z AminoLotto biggrin.gif Parę zmiennych można było liczyć na bieżąco, ale by nie robić tego co i rusz to przekazywałem do funkcji jako parametry. W wyniku otrzymujesz coś takiego dla mojego kompletnie zmyślonego przypadku i klepania po klawiaturze numerycznej:
  1. array(4) { [0]=> string(35) "23+464+467+624+533+1434+3455 = 7000" [1]=> string(27) "23+464+624+1434+3455 = 6000" [2]=> string(14) "467+533 = 1000" [3]=> string(15) "5467+533 = 6000" }

EDIT2: Foreach od 21 linijki już tylko obrabia wyniki byś widział jakie kwoty są konieczne do zsumowania. Ale konkretne indeksy masz już w tym momencie dostępne. Wystarczy że zrobisz var_dump($bulls_eye), a dostaniesz tablicę 2-wymiarową, gdzie jako wartości są klucze po przecinku i suma.
ADeM
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
  5. <title></title>
  6. </head>
  7. <body>
  8. <?php
  9. $DbHost = '';
  10. $DbUser = '';
  11. $DbPassword = '';
  12. $DbName = '';
  13. mysql_connect( $DbHost, $DbUser, $DbPassword );
  14. mysql_select_db( $DbName );
  15.  
  16. if( isset( $_POST['kwota'] ) ){
  17. $add = mysql_query( "INSERT INTO amino VALUES( '', '". $_POST['kwota'] ."' )" ) or die( mysql_error() );
  18. echo 'Kwota <b>'. $_POST['kwota'] .'</b> została dodana. <br />';
  19. }
  20.  
  21. if( isset( $_GET['id'] ) ){
  22. $delete = mysql_query( "DELETE FROM amino WHERE Id='". $_GET['id'] ."' LIMIT 1" ) or die( mysql_error() );
  23. echo 'Kwota <b>'. $_GET['kwota'] .'</b> została usunięta. <br />';
  24. }
  25.  
  26. echo '<b>Wprowadzone kwoty:</b>';
  27. $select = mysql_query( "SELECT * FROM amino" ) or die( mysql_error() );
  28. $results = array();
  29. while( $result = mysql_fetch_assoc( $select ) ){
  30. echo ' '. $result['Kwota'];
  31. $results[] = $result['Kwota'];
  32. }
  33. echo '<br /><b>Kombinacje:</b><br />';
  34.  
  35. $tab = $results;
  36. $ile = count($tab);
  37.  
  38. $num = str_repeat('1', $ile);
  39. $num = bindec($num); // mamy (prawie) wyliczoną liczbę możliwych kombinacji
  40.  
  41. $tmpNum = $num;
  42. $results = array();
  43. $modulo1000 = array();
  44.  
  45. while($tmpNum > 0)
  46. {
  47. // zeby errorow nie bylo
  48. $tmpNumStr = str_pad(decbin($tmpNum), $ile, '0', STR_PAD_LEFT);
  49.  
  50. $sum = 0;
  51. $sumStr = '';
  52. $numsAdded = 0;
  53.  
  54. for($i=0; $i<$ile; $i++)
  55. {
  56. // czy wstawic liczbe
  57. if($tmpNumStr[$i] == '1')
  58. {
  59. $sum+= $tab[$i];
  60. $sumStr.=' + '.$tab[$i];
  61. $numsAdded++;
  62. }
  63. }
  64. // jezeli tylko jedna liczba to nie jest to działanie
  65. if($numsAdded>1)
  66. {
  67. //$results[] = substr($sumStr, 3).' = '.$sum;
  68. if( ( $sum % 1000 == 0 ) AND ( $sum <= 10000 ) ){
  69. $modulo1000[] = substr($sumStr, 3).' = '.$sum;
  70. }
  71. }
  72.  
  73. $tmpNum --;
  74. }
  75.  
  76. foreach( $modulo1000 as $result ){
  77. echo $result .'<br />';
  78. }
  79.  
  80. echo '<b>Usuwanie:</b><br />';
  81. $select = mysql_query( "SELECT * FROM amino" ) or die( mysql_error() );
  82. while( $result = mysql_fetch_assoc( $select ) ){
  83. echo '<a href="index.php?id='. $result['Id'].'&kwota='. $result['Kwota'] .'">'. $result['Kwota'] .'</a> ';
  84. }
  85. ?>
  86. <form action="index.php" method="post">
  87. <input type="text" name="kwota">
  88. <input type="submit" value="dodaj">
  89. </form>
  90. </body>
  91. </html>


  1. amino
  2. Id int(11)
  3. Kwota int(11)


? ;>
Zyx
Wcale nie twierdzę, że w PHP magicznie pojawiła się wielowątkowość. Przyjrzyj się uważnie, jak autor chce realizować obliczenia:

mamy liczby a, b, c, d, e, f

a
a+b
a+b+c
a+b+c+d
a+b+c+d+e
a+b+c+d+e+f

Jeśli w którymkolwiek miejscu osiągniemy wielokrotność 1000 lub przekroczymy 10 000, to zaczynamy ponownie:

b
b+c
b+c+d
b+c+d+e
b+c+d+e+f

Warunek ten sam, przeskakujemy dalej:

c
c+d
c+d+e
c+d+e+f

itd.

Autor nic nie wspomniał, że obliczenia muszą być realizowane dokładnie w takiej kolejności. Więcej, napisał, że sumy typu "b+d+f" mogą wystąpić EWENTUALNIE, a ponieważ dodatkowo oznaczył post jako "Pomógł", wnioskuję, że dobrze go zrozumiałem i postuluję, że można je realizować w taki sposób:

Iteracja 1 (każdy wiersz oznacza pamiętaną sumę):

a

Iteracja 2:
a+b
b

Iteracja 3:

a+b+c
b+c
c

Iteracja 4:

a+b+c+d
b+c+d
c+d
d

itd.

Jeśli podczas sumowania okaże się, że osiągnęliśmy wielokrotność 1000 lub przekroczyliśmy 10000, to taką sumę wywalamy z dalszych obliczeń. Przypuśćmy, że w iteracji 4 suma b+c+d dała nam 3000. Wtedy wyświetlamy "Wygrałeś" i usuwamy ją, dzięki czemu w iteracji 5 mamy:

a+b+c+d+e
c+d+e
d+e
e

I to właśnie robi zaproponowany przeze mnie kod - twierdzę, że poprawnie wyłapie on każdą sumę "n" kolejnych liczb, która daje wielokrotność 1000 mniejszą, niż 10000, czyli to, czego chce autor.

PS. Guzik mnie obchodzi, czy to jest jakieś AminoLotto czy inny bzdet smile.gif. Nie oglądam telewizji, nie kupuję Amino, autor chciał sumowanie "n" kolejnych liczb i dostał takie sumowanie smile.gif.
thek
I dlatego też napisałem, że pomysł z oknami jest dobry, ale należało by go nieco rozszerzyć o wspomniane przeze mnie elementy jak "przekręcenie" tablicy dla ostatnich elementów i przechwycenie elementu początkowego dla danego okna. Jeśli spojrzysz do mojego kodu, to ja już "zaszalałem" z rekurencją, dla której obojętne jest już, czy mamy je obok siebie czy nie, bo trafi także jako pasującą choćby kombinację 8 i 10 elementu. Ale jak popatrzysz na wyniki to zobaczysz, że wariacje są nawet kilkuelementowe w sumach. Taki var_dump przed przekładaniem na zrozumiałą sumę daje w wyniku nawet 7-elementowy pierwszy element:
  1. array(4) { [0]=> array(2) { [0]=> string(16) "2,5,6,7,10,11,12" [1]=> int(7000) } [1]=> array(2) { [0]=> string(11) "2,5,7,11,12" [1]=> int(6000) } [2]=> array(2) { [0]=> string(4) "6,10" [1]=> int(1000) } [3]=> array(2) { [0]=> string(4) "8,10" [1]=> int(6000) } }
Nie można chyba już większej ilości kombinacji "każdy z każdym i w razie czego jeszcze z innymi" zrobić smile.gif Wiem, że mój algorytm jest kolosem pamięciożernym, ale działa winksmiley.jpg

Twój także gdy zredukujemy liczbę kombinacji do n-elementowych ciągów kolejnych wartości. ale ze zmniejszającą się liczbą dla ostatnich elementów. Bo w sytuacji gdy mamy przedostatni+ostatni+pierwszy możliwość krotności 1000, to akurat nie masz możliwości jej wyłapać. Ogólnie jednak "okienkowanie" to często stosowany wariant w wielu algorytmach numerycznych i sam nieraz go stosuje... Tyle, że jak wspomniałem, ma on swoje ograniczenia i myslę, że jesteś ich świadom.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.