x-kom hosting

Program Do Liczenia Liczb Pierwszych

Liber
utworzono
utworzono

Siema! mam progs do liczenia l pierwszych. jednak bazuje on na typie zmiennej: integer, ktorej zakres jest mi niewystarczajacy. walnalem wiec typ:extended i tu pojawia sie moje pytanie. Podaje czesc "liczaca" kodu:

var dowyns, odwyns, i, pier, c : Extended; //zmienne procedury generacji liczb ilp, tt : currency;  // zmienne dodatkowe (do object pascala) wyn : AnsiString;   // label ddd;beginButton1.Caption := '>Generuje<';ilp := 0;  //ilosc liczb pierwszych  (zmienna dodatkowa)dowyns := strtofloat(odwyn.Text);  //liczba ododwyns := strtofloat(dowyn.Text);  //liczba dott := GetTickCount;			//Pobranie czasuwyn := 'Liczby pierwsze od ' + floattostr(odwyns) + ' do ' + floattostr(dowyns) +(Chr(13) + Chr(10));		   //taki ciągo do wynikui := trunc(odwyns/2)*2-1;	  //nie wiem co napisałem;-)//<początek procedury generowania   while (i < dowyns-1) do begin  //pętla glowna wybierająca liczby do sprawdzenia   i := i + 2;					// i to wybrana liczba	  c := 1;					 // c to liczba do dzielenia	  pier := trunc(sqrt(i)+2);   // do tej liczby nalerzy dzielic aby otrzymac liczbę pierwszą	  while c < pier do begin		 c := c + 2; If i mod c = 0 then GoTo ddd;	  end;	   wyn := wyn + floattostr(i) + ', '; //jesli to liczba pierwsza to dojdzie do	   ilp := ilp + 1;				  //tej linii i zostanie zapisana;-)	   gauge1.Progress := trunc(((i-odwyns)/(dowyns - odwyns))*100);ddd:	end;//>koniec procedury generowania

chodzi o zaznaczony na czerwono obszar kodu. jezeli zrobie na integer to dziala, a przy tym juz nie. probowalem tez currency i tez lipa. Pls pomozcie:D A moze zna ktos jakis lepszy algorytm?:D

onna
komentarz
komentarz

Nie wiem jak pozostali ale nie widze tego pola na czerwono zaznaczonego ;)

Liber
komentarz
komentarz
 If i mod c = 0 then GoTo ddd;

Po prostu procedura kolorowania chyba nie zadzialaa jeszcze to sprawdze:D

ahaa no bo to jest kod:D wiec tu nie dziala kolorowanie wiec chodzi o 8wiersz od dolu kodu

grucha
komentarz
komentarz
i mod c=0

Kiedy Robisz dzielenie modulo jakiejś liczby musi ona być typu całkowitego, a typ Extendet z pewnością takim nie jest ;]

Btw. Taka wskazówka na przyszłość: w pascalu raczej nie używa się instrukcji skoku GoTo :)

Liber
komentarz
komentarz
w pascalu raczej nie używa się instrukcji skoku GoTo

Kompilator - delphi 7:D

a typ Extendet z pewnością takim nie jest ;]

to jaki jest najwiekszy podobny do integer? i jak sie robi nim skroty typu xxxtostr (np inttostr ?)

grucha
komentarz
komentarz

Co do GoTo, nie chodzi o to, że tej instrukcji tam nie ma, tylko do wyboru jest tyle pętli, instrukcje wyboru, że tej instrukcji raczej się nie stosuje, bo zaburza strukturę programu, ale to już zależy od indywidualnego podejścia :)

to jaki jest najwiekszy podobny do integer? i jak sie robi nim skroty typu xxxtostr (np inttostr ?)

Jeżeli piszesz w Delphi to użyj Int64, konwersja wygląda tak samo jak w przypadku integer czyli IntToStr i vice versa ;]

Liber
komentarz
komentarz

int64 to tez troche maly przedzial. a nie mozna tak zrobic ze sam bym zrobil typ, np wpisal od 0 do np 4x10^10000 ?

grucha
komentarz
komentarz

W sumie jak Ci zależy na tak dużym przedziale, to zastosuj ten Extended. Tylko później w miejscu

i mod c=0

musisz to i przekształcić na typ całkowity. I tutaj pojawia się problem, ponieważ możesz zastosować do tego Round, ale jeżeli spojrzymy na definicje tej funkcji:

function Round(X: Extended): Int64;

to widzimy, że i tak wynik będzie tylko typu Int64.

Dlatego nie widzę innej możliwości.

Kiedyś widziałem, że ktoś napisał coś takiego w asm, ale to było dawno, i to było do zastosowania w Turbo Pascalu i teraz nawet nie pamiętam, czy do na prawdę służyło do tego.

Tak, że szukaj dalej, może coś Ci się uda znaleźć :)

Liber
komentarz
komentarz

;/ szkoda.. a nie idzie zrobic wlasnego typu zmiennych?:D np Liberstyp : 0...1231231231231123 ? a jakby cos takiego moze przez tablice rozwiazac? da rede?:D

+1pt 4 grucha:D

grucha
komentarz
komentarz

Oczywiście możesz zastosować własny typ danych np:

type TMojTyp = 0..9999999999999999999;

Ale później np. tą zmienną musisz zamienić na String a do tego musisz zastosować IntToStr, i tutaj pojawia Ci się błąd

[DCC Error] Unit1.pas(10): E2011 Low bound exceeds high bound

Czyli jesteśmy w punkcie wyjścia :)

Ale jak wspomniałem, sposób może istnieć, tak że się nie zniechęcaj :)

Liber
komentarz
komentarz (edytowane)
type

TMojTyp = 0..9999999999999999999;

Probowalem juz tym, ale to i tak jest za male:D hehehe a w dodatku tak jak napisałeś nie mozna zmienic na string.... pogadam z gatesem moze w nowym windowsie bedie dodatek ze mozna nieskonczana liczbe w typie walnac hahahhahaha:D:D JOKE na razie zostaje czekanie i myslenie, a takze szukanie odpowiedzi w necie:D DzIeNkI pozdro.

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.